¿Ignorando el contenido de un directorio ya registrado?

227

Tengo un repositorio de git que se usa solo para contener gráficos y archivos de sonido utilizados en varios proyectos. Todos están en un directorio sin subdirectorios. Ahora acabo de crear un script para copiar estos activos desde otro directorio estructurado, con varios niveles de subdirectorios.

Ahora solo quiero que git haga un seguimiento de la estructura de archivos jerárquica (fuente), y el directorio plano (destino) (con todos los archivos en una pila) debe ignorarse.

Agregué el directorio de destino a .gitignore, pero git todavía sigue los cambios en él. Pensé que si confirmaba la eliminación del archivo anterior en el directorio de destino, git podría dejar de rastrear los nuevos contenidos (copiados por el script), pero no lo hace.

¿Cómo hago que git se olvide del directorio de destino?

Felixyz
fuente
¿Cuál es el nombre del directorio y lo que has puesto en .gitignore
mmmmmm
1
El nombre es DirNameIrrelevant y en .gitignore he intentado poner "DirNameIrrelevant", "DirNameIrrelevant /" y "DirNameIrrelevant / *"
Felixyz

Respuestas:

524

Este comando hará que git elimine su directorio y todos los archivos debajo de él sin eliminarlos:

git rm -r --cached <your directory>

La -ropción provoca la eliminación de todos los archivos de su directorio.

La --cachedopción hace que los archivos solo se eliminen del índice de git, no su copia de trabajo. Por defecto git rm <file>eliminaría <file>.

Gordon Wilson
fuente
Ah gracias. Muy útil, aunque no veo por qué esto debería ser necesario (¿por qué no es suficiente agregar el directorio en .gitignore?). ¿Podrías decirme para qué sirve la caché?
Felixyz
Por supuesto. Modifiqué mi respuesta para describir las dos opciones.
Gordon Wilson el
En cuanto a por qué esto es necesario, solo puedo especular. Supongo que los creadores querían que el seguimiento de los archivos fuera explícito para disminuir los riesgos de descubrir por error partes importantes de su proyecto. Me imagino que también hay razones técnicas.
Gordon Wilson el
15
El gitignore se usa para determinar de qué archivos no rastreados será consciente; no tiene relación con los archivos que ya están siendo rastreados. Si el usuario desea rastrear archivos ignorados, git lo permite. Esto podría hacerse usando add -fo ser su situación. Como dijo Gordon, esto evita que borre accidentalmente un montón de archivos: el repositorio es la lista maestra, no el gitignore. Esto también le permite rastrear manualmente algunas cosas que de otro modo serían ignoradas por una regla comodín, algo que he encontrado útil.
Cascabel el
la -ropción no es "provoca la eliminación de todos los archivos de su directorio" sino que se repite a través de los subdirectorios.
MrE
78

Si necesita tener un archivo rastreado (registrado), pero no desea rastrear más cambios de un archivo mientras lo mantiene en su repositorio local, así como en el repositorio remoto, esto puede hacerse con:

git update-index --assume-unchanged path/to/file.txt

Después de eso, cualquier cambio en este archivo ya no aparecerá en git status.

jone
fuente
1
Si bien OP puede haber pedido un directorio, esto es exactamente lo que estaba buscando: ignorar los cambios adicionales en un solo archivo registrado; ¡Gracias!
sdaau
1
para ignorar un directorio completamente, use 'git update-index --assume-unchanged dirName / *'. Me tomó un tiempo encontrar la sintaxis, se necesita '*' aquí
J-Dizzle
1
¿Cómo podría uno revertir esto?
Rhys
3
@Rhys revertirla:git update-index --no-assume-unchanged dirname/**/*
JobJob
3

Para un subdirectorio llamado blah/agregado a git, parece que ambos de los siguientes funcionan para ignorar los archivos nuevos blah/. Añadido a .gitignore:

blah 
blah/*
Stef
fuente
1

TL; DR para limpiar su repositorio git y asegurarse de que TODOS sus elementos ignorados sean ignorados:

git rm -r --cached .
git add .
git commit -m "Clean up ignored files"

Nota: no necesita especificar un directorio, de esta manera está limpiando todo el repositorio remoto .

Para ir más lejos lee esto

Sección de la economía
fuente
0

No estoy seguro si esto cuenta o me hace una mala persona, pero aquí va.

  1. He añadido *Generated*al archivo raíz .gitignore
  2. Envié los archivos que quiero mantener como GeneratedFile.Whatever.ext. CheckedIn
  3. Hice un gancho de git en el pago posterior para llamar a un script de PowerShell haciendo esto:

dir *.CheckedIn -Recurse | %{ copy $_.FullName "$($_.FullName)".Replace("CheckedIn","") -EA SilentlyContinue}

Me siento un poco mal conmigo mismo ... pero de hecho funciona.

Steve
fuente
-2

Ok, parece que primero debe hacer un check-in con el directorio completamente vacío (ni archivos antiguos ni nuevos), y cualquier archivo agregado a partir de entonces será ignorado. Si elimina los archivos antiguos y los nuevos antes de confirmar, los nuevos se agregarán al repositorio, aunque deben ignorarse.

Al menos, esto funcionó para mí en esta situación. Sería genial si alguien pudiera proporcionar más información sobre lo que está sucediendo.

Felixyz
fuente
1
Versión corta de lo que hemos dicho en otra parte: el gitignore afecta a lo que los datos no rastreados serán conscientes. No afecta lo que se hará con los datos de los que le ha hablado (p. Ej., Dirigido a agregar al repositorio).
Cascabel el
Por lo tanto, tiene sentido que los archivos que se rastrearon y ahora se eliminen deberían rastrearse como tales, pero todavía no tiene sentido para mí que se rastreen los archivos agregados (si se realizan antes del próximo compromiso), mientras que si yo 1) ignorar, 2) eliminar archivos, 3) confirmar, 4) agregar un nuevo archivo, los nuevos archivos no son rastreados.
Felixyz