Eliminar una carpeta del seguimiento de git

405

Necesito excluir una carpeta (carga de nombres) del seguimiento. Traté de correr

git rm -r --cached wordpress/wp-content/uploads

y después de eso agregué el camino a .gitignore

/wordpress/wp-content/uploads

pero cuando corrí git status, aparecen como eliminados. Si trato de confirmar los cambios, los archivos se eliminarán, no solo se eliminarán del seguimiento.

¿Qué estoy haciendo mal?

También he intentado

git update-index --assume-unchanged <file>

pero esto parece destrabar solo archivos. Pero necesito eliminar una carpeta completa (incluidas las subcarpetas) del seguimiento.

Stefan Diabo
fuente
Eliminar no significa que git va a eliminar tus archivos. Sin embargo, si lo usará reset --hard, lo hará.
keltar
2
Como @keltar menciona, la confirmación no hará que se eliminen sus archivos. Confirmará su eliminación de Git , pero su copia de trabajo aún los contendrá. Pero si usted se pullcompromete en otro lugar, esos archivos se eliminarán del nuevo sistema.
Chris

Respuestas:

869

Encontré esta pregunta mientras buscaba en Google "git remove folder from tracking". La pregunta del OP me lleva a la respuesta. Lo estoy resumiendo aquí para las generaciones futuras.

Pregunta

¿Cómo elimino una carpeta de mi repositorio git sin eliminarla de mi máquina local (es decir, entorno de desarrollo)?

Responder

Paso 1. Agregue la ruta de la carpeta al .gitignorearchivo raíz de su repositorio .

path_to_your_folder/

Paso 2. Elimina la carpeta de tu seguimiento local de git, pero mantenla en tu disco.

git rm -r --cached path_to_your_folder/

Paso 3. Envía tus cambios a tu repositorio de git.

La carpeta se considerará "eliminada" desde el punto de vista de Git (es decir, están en la historia pasada, pero no en la última confirmación, y las personas que retiren de este repositorio eliminarán los archivos de sus árboles), pero permanezcan en su directorio de trabajo debido a que ha utilizado --cached.

Tod Birdsall
fuente
2
Pregunta rápida, ¿la ruta de la carpeta tiene que ser la ruta completa? o solo la ruta con el repositorio git actuando como base?
HMSCelestia
Creo que es el camino completo, pero no lo recuerdo con certeza.
Tod Birdsall
77
"y las personas que saquen de este repositorio eliminarán los archivos de sus árboles" ¿Puedo evitar esto?
Leo Gasparrini
¡Esto eliminó correctamente mis archivos del seguimiento en una rama, pero los eliminó después de una fusión!
Harold
1
para mí aún queda. Además, ¿debo anular la selección de esos archivos al confirmar cuáles están en la carpeta? Lo intenté en ambos sentidos. Si se desmarca, no permite presionar, pero luego cambié un carácter en otro archivo que debería rastrearse. Todavía no ayuda
Darius.V
44

Esto funciona para mi:

git rm -r --cached --ignore-unmatch folder_name

--ignore-unmatch es importante aquí, sin esa opción git saldrá con error en el primer archivo que no está en el índice.

qed
fuente
unknown option 'ignore unmatched'
Iñigo
Esta es una bandera importante si el directorio está vacío, ¡gracias!
MNN
muy útil si desea eliminar ciertas extensiones de archivo de un directorio también:git rm -r --cached --ignore-unmatch .idea/*.xml
takanuva15
14

Para olvidar el directorio recursivamente agregue /*/*a la ruta:

git update-index --assume-unchanged wordpress/wp-content/uploads/*/*

Usar git rm --cachedno es bueno para la colaboración. Más detalles aquí: ¿Cómo detener el seguimiento e ignorar los cambios en un archivo en Git?

vitalets
fuente
1
¡Esta es una solución muy elegante! El truco del camino recursivo me salvó el día. ¡Gracias!
Aziz Alto
8

Sé que este es un hilo antiguo, pero solo quería agregar un poco ya que la solución marcada no resolvió el problema para mí (aunque lo intenté muchas veces).

La única forma en que pude detener el seguimiento de la carpeta desde git form fue hacer lo siguiente:

  1. Haga una copia de seguridad de la carpeta local y colóquela en un lugar seguro.
  2. Eliminar la carpeta de su repositorio local
  3. Asegúrese de que la memoria caché esté limpia git rm -r --cached your_folder/
  4. Añadir your_folder/ a .gitignore
  5. Cometer cambios
  6. Agregue la copia de seguridad nuevamente a su repositorio

Ahora debería ver que la carpeta ya no se rastrea.

No me preguntes por qué simplemente borrar el caché no funcionó para mí, no soy un súper asistente de Git pero así es como resolví el problema.

lukehillonline
fuente
¡¡¡Gracias!!! Git me estaba volviendo loco sin ignorar la carpeta .metadata del eclipse. Seguí tus pasos con la carpeta eclipse .metadata, y finalmente funcionó.
MasterN8
5

De la documentación de git:

Otra cosa útil que puede querer hacer es mantener el archivo en su árbol de trabajo pero eliminarlo de su área de preparación. En otras palabras, es posible que desee mantener el archivo en su disco duro pero que Git no lo rastree más. Esto es particularmente útil si olvidó agregar algo a su archivo .gitignore y lo organizó accidentalmente, como un archivo de registro grande o un montón de archivos compilados .a. Para hacer esto, use la opción --cached:

$ git rm --cached readme.txt

Entonces, ¿quizás no incluya el "-r"?

usuario3750325
fuente
1
El OP ya lo intentó --cached. La -ropción es para "recursivo", que debe incluirse en esta instancia.
Chris
Encontré esto útil. Estaba buscando cómo hacerlo en una carpeta y luego veía la forma de hacerlo en un archivo. Estoy marcando este comentario.
luz