rastreados - usando gitignore para ignorar(pero no eliminar) archivos
gitignore java (5)
Tengo un directorio tmp en mi informe de git que me gustaría seguir existiendo, pero me ignorarán. Lo agregué a .gitignore
, pero el git status
todavía me dice acerca de los cambios a los archivos en ese directorio. Intenté git rm -r --cached
, pero eso lo quita del repositorio remoto. ¿Cómo puedo dejar de seguir los cambios en este directorio, pero todavía permitir que exista? También necesito hacer esto para 1 archivo, pero los cambios a eso también aparecen en el git status
después de que los .gitignore
. ¿Que debería hacer?
.gitignore no tiene ningún efecto en los archivos rastreados.
Lo que desea es establecer el bit de asumir sin cambios en los archivos en el directorio tmp /. Hay una buena explicación sobre cómo hacerlo aquí: Git: destraba un archivo en el repositorio local únicamente y manténlo en el repositorio remoto
Además, one-liners para establecer assume-sin cambios en todos los archivos en un directorio - git update-index --assume-unchanged en el directorio .
Coloque un /
al final del nombre del directorio en su archivo .gitignore
, es decir,
tmp/
Si ha rastreado archivos dentro de ese directorio, necesita decirle a git que se olvide de ellos primero (antes de agregar el directorio a la lista de ignorar). Asumiendo que no tienes nada vital allí (es decir, que puedes rascarlo):
git rm -rf ./tmp/
git commit -m "untrack tmp dir"
mkdir tmp
echo tmp/ >> .gitignore
git add .gitignore ; git commit -m "add tmp/ to ignore list"
Los nuevos archivos en ese directorio no serán rastreados.
La opción --cached
a git rm
solo funciona en el índice (cambios pendientes más o menos). No tiene ningún efecto en el árbol de trabajo o el estado de lo que se ha rastreado o no.
En lugar de .gitignore
, puede actualizar el repositorio local de git ejecutando el siguiente comando:
git update-index --assume-unchanged <file>
En este caso, se realiza un seguimiento de un archivo en el repositorio de origen. Puede modificarlo en su repositorio local y git nunca lo marcará como cambiado. Lee mas en:
- http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/ - se informó muerto en algún momento (lo siento, no mío)
- http://archive.robwilkerson.org/2010/03/02/git-tip-ignore-changes-to-tracked-files/ - otro que cubre el mismo tema
Ignorar los cambios realizados en los archivos mientras permite que existan es el propósito exacto de .gitignore
. Entonces, agregar los archivos (o directorios) a .gitignore
es lo único que tienes que hacer.
Pero su problema es que git ya está rastreando los archivos que desea ignorar y .gitignore
no se aplica a los archivos rastreados. La única forma de detener este rastreo es decirle a git que los elimine. Al usar git rm --cached
, git rm --cached
que git elimine tus archivos locales, pero cualquier otro repositorio que obtenga los cambios aplicará la eliminación. No creo que haya una manera de evitar eso desde su propio repositorio. Debe hacer algo en los otros repositorios, o aceptar que los archivos serán eliminados.
Para evitar la eliminación en otro repositorio, puede:
- (obviamente) haga una copia de seguridad de los archivos en algún lugar, extraiga los cambios y restaure los archivos,
- o también
git rm --cached
los archivos y confirmar antes de tirar de los cambios. Git combinará muy bien las dos eliminaciones sin tocar los archivos que ya no se han rastreado.
Parece que estás intentando rastrear un archivo (por ejemplo, index.php
), agregarlo a un repositorio remoto, luego dejar de seguir su seguimiento, mientras mantienes el archivo en el control remoto (es decir, mantener index.php
sin cambios en el repositorio remoto mientras se cambia localmente).
Por lo que entiendo, git no puede hacer esto. Puede rastrear un archivo, o no. Si realiza un seguimiento de un archivo, existe en el repositorio remoto y cambia cuando se realizan cambios en él. Si no rastrea un archivo, no existe en el repositorio remoto.
Debido a que no es posible hacer exactamente lo que quiere con git, existen otras soluciones potencialmente, dependiendo de su situación exacta. Por ejemplo, ¿por qué no quieres que index.php
cambie en remoto cuando lo cambias localmente? ¿Hay configuraciones específicas del usuario en el archivo? Si este es el caso, puede hacer:
cp index.php index_template.php
git rm --cached index.php
Ahora edita index_template.php para que sea como quieras que aparezca en el repositorio remoto. Agregue algo a su archivo README para decirle a las personas que utilizan su repositorio que una vez que lo clonan, deben copiar index_template.php en index.php y editarlo para que se ajuste a sus necesidades.
git add index_template.php
git add README
git commit -m ''added template index.php file''
git push
Cuando alguien clona su repositorio, debe crear su propio index.php
. Ha hecho que sea más fácil para ellos: simplemente copie index_template.php
en index.php
y index_template.php
con configuraciones específicas de la computadora.