remota - git agregar agregar archivos ignorados
git push example (10)
Agregue el archivo a git ignore, luego
git update-index --assume-unchanged <file>
Estoy tratando de eliminar un directorio previamente rastreado de git, que funciona, pero se vuelve a agregar con cada git add .
posterior git add .
, git add -A
, etc. Esto es lo que hice:
Agregar a .gitignore en la raíz del proyecto:
node_modules
Ejecute lo siguiente:
git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master
Hasta ahora todo bien, esto elimina el directorio del repositorio remoto. El problema es cuando más tarde ejecuto el git status
, me dice que el directorio node_modules no se ha rastreado y continúa volviendo a agregarlo en futuros commits.
¿Qué me estoy perdiendo y / o cómo puedo encontrar la raíz de mi problema?
Desde here :
El comando git add no agregará archivos ignorados por defecto. ... El comando git add se puede usar para agregar archivos ignorados con la opción -f (forzar).
Información adicional de los comentarios:
Estoy rastreando el archivo .gitignore.
git check-ignore node_modules/
returns node_modules / como se esperaba.
Sin uso de submódulos.
Actualizar:
Creé una muestra que parece replicar el problema siguiendo los pasos anteriores:
https://github.com/awhitehouse104/SampleRepo
Resolución:
Para resumir la respuesta y los comentarios de abajo, el problema estaba en la codificación de mi archivo .gitignore. Había usado echo ''node_modules'' > .gitignore
para crear el archivo en Windows 8 y salió como UTF-16 con BOM (según la respuesta a continuación). Después de algunas búsquedas en google, parece que esta es la codificación predeterminada con powershell y puedo confirmar que el guardado como UTF-8 parece haber resuelto el problema.
tldr; Probablemente no use este método para crear archivos .gitignore o esté preparado para cambiar la codificación
echo ''node_modules'' > .gitignore
Creé un repositorio para tratar de duplicar su problema, y obtuve la primera respuesta de http://www..com/questions/11451535/gitignore-not-working para trabajar.
Aquí está mi informe si tiene curiosidad: https://github.com/IAMZERG/so_project_gitignore
Intente agregar esto al .gitignore en su lugar:
** / directory_to_remove
Después de eso, ejecute git rm --cached directory_to_remove -r
El estado de git debería mostrar que eliminó un grupo de archivos en el directorio que está tratando de eliminar. Entonces, comprométalo y presiona hacia tu control remoto, y todo debería estar dorado ... ¿Tal vez?
El origen tiene que ser simple. Aquí hay un pequeño golpe para demostrarlo. Siéntase libre de editarlo, si no representa su caso de uso.
#!/bin/bash
rm -rf /tmp/git_test
mkdir /tmp/git_test/
git init --bare /tmp/git_test/primary_repo
# populate repo
cd /tmp/git_test/
git clone ./primary_repo ./secondary_repo
cd secondary_repo
echo hi_bob > some_content
mkdir node_modules
echo hi_dave > node_modules/moduleA
git add .
git commit -m "populated primary"
git push
# do the removal in tertiary
cd /tmp/git_test/
git clone ./primary_repo ./tertiary_repo
cd tertiary_repo
echo node_modules >> .gitignore
git add .gitignore
git rm -r --cached node_modules
git commit -a -m "removed node_modules"
git push origin master
rm -r node_modules
echo --------------------------------
echo git status:
git status
Es probable que tengas una regla negativa (regla de incluir de nuevo, la que comienza con an !
) En tu archivo .gitignore
algún lugar después de la línea node_modules
.
git check-ignore
tiene un error / ambigüedad en los documentos. Usted espera que si git check-ignore node_modules/
prints node_modules/
, entonces node_modules/
es ignorado. Pero en realidad imprime una ruta de acceso si ese nombre de ruta coincide con cualquier patrón de ignorar, ya sea positivo o negativo. La única forma de estar seguro es usar la opción -v
( --verbose
), que hará que git check-ignore
imprima el patrón coincidente.
Además, si git check-ignore -v
dice que se ignora un directorio, no significa necesariamente que se ignoren todos los archivos en ese directorio. Repo de ejemplo:
/
.git/
.gitignore
node_modules/
bar
foo
$ cat .gitignore
/node_modules/*
!/node_modules/foo
$ git check-ignore -v node_modules/
.gitignore:1:/node_modules/* node_modules/
^ positive pattern => ignored
$ git check-ignore -v node_modules/foo
.gitignore:2:!/node_modules/foo node_modules/foo
^ negative pattern => not ignored
$ git add -A
$ git status
# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# new file: node_modules/foo
#
Entonces, si git check-ignore -v node_modules/
says node_modules/
es ignorado, git add -A node_modules/
y luego ejecute git check-ignore -v --no-index
en los archivos individuales que se agregaron, para descubrir por qué se agregaron .
Actualización: no esperaba eso: su archivo .gitignore
está en la codificación "UTF-16 con BOM (marca de orden de bytes)":
$ cat .gitignore | hexdump -vC
00000000 ff fe 6e 00 6f 00 64 00 65 00 5f 00 6d 00 6f 00 |..n.o.d.e._.m.o.|
00000010 64 00 75 00 6c 00 65 00 73 00 0d 00 0a 00 |d.u.l.e.s.....|
Es por eso que probablemente Git no pueda manejarlo. Guarde el archivo en UTF-8 sin BOM, eso debería solucionar el problema. Pero también sugiero que se presente un informe de error contra git check-ignore
: en este caso, su resultado no es coherente con lo que git realmente ignora.
Esto es lo que hago para ignorar la carpeta node_modules después de rastrearla.
Crea el archivo .gitignore y agrega node_modules a él.
Confirme el archivo .gitignore . Después de este punto, lo que actualice en la carpeta node_modules no aparecerá en
git status
.Pero esto no elimina lo que ya tenemos en el repositorio en la carpeta node_modules . Entonces ahora debemos eliminar todo lo que hemos cometido previamente.
Para esto, use
git rm --cached node_modules -r
Ahora el
git status
mostrará que los archivos se eliminaron.Use el comando
git commit -m "node_modules removed"
con cualquier mensaje.
Ahora todo debe ser eliminado del repositorio y los cambios futuros no serán rastreados.
He encontrado una forma de agregar archivos a .gitignore, incluso si ya se han confirmado una vez. Es un poco brutal pero funciona genial.
Agregue los diferentes archivos a su .gitignore
Saca estos archivos de tu proyecto de git
Volver a analizar y cambiar de escenario, estas operaciones le dirán que estos archivos se han eliminado
Cometer
Mueva sus archivos a su proyecto, ¡ya no serán rastreados!
Otro enfoque si no quieres usar git rm --cached
rm -Rf node_modules
git add -u
git commit -m "stop tracking node_modules"
npm install
# done
También tenga en cuenta la distinción entre node_modules y node_modules / que parece tener correcto. (Gracias umläute por la nota sobre esto)
Tu puedes hacer
git check-ignore -v --no-index path/with/unexpected/result
para ver por qué git add
o no esa ruta.
En particular, el punto es que desea verificar qué se está agregando realmente, no un directorio.
más aún, find . -name .git
find . -name .git
. Los submódulos son repos anidados, .gitmodules
y el comando del submódulo son útiles, pero están ahí para ayudarlos.
Tuve un problema similar. Asegurándome de que mi codificación era ANSI y que los finales de línea fueron Unix (LF) corrigió mi problema.
gitignore: especifica los archivos intencionalmente no rastreados para ignorar.
$ HOME / .config / git / ignore, $ GIT_DIR / info / exclude, .gitignore
Cada línea en un archivo de gitignore especifica un patrón. Al decidir si ignorar una ruta, Git normalmente verifica patrones de gitignore de múltiples fuentes, con el siguiente orden de precedencia, de mayor a menor (dentro de un nivel de precedencia, el último patrón coincidente decide el resultado):
Para ignorar todo el directorio, debe usar /**
,
Un seguimiento / ** coincide con todo lo que está dentro. Por ejemplo, abc / ** hace coincidir todos los archivos dentro del directorio "abc", con respecto a la ubicación del archivo .gitignore, con profundidad infinita.
O
Puede ignorar todo el directorio agregando esta línea a su archivo raíz .gitignore:
/ Dir_Name
En su lugar, puede agregar un archivo /logs/.gitignore que contenga esto:
[^.] *
El directorio permanecerá en su repositorio, pero se ignorarán todos los archivos dentro del directorio. ¡Fácil!
Los pasos que debes seguir son:
Eliminarlo del directorio del proyecto (sin eliminarlo):
git rm - carpeta caca / /
- Si aún no tiene un .gitignore, puede hacer uno directamente dentro de la carpeta de su proyecto:
- proyecto / .gitignore. Coloca la carpeta / * (o cualquiera de los patrones que creas mejores de la lista anterior) en el .gitignore Commit:
- git commit -m "mensaje".
- Presiona tu cambio a github.
Ejemplo para excluir todo, excepto un directorio específico foo / bar (tenga en cuenta el / * - sin la barra inclinada, el comodín también excluiría todo dentro de foo / bar):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar