usando gitignore para ignorar (pero no eliminar) archivos

98

Tengo un directorio tmp en mi repositorio de git que me gustaría que aún existiera, pero que se ignore. Lo agregué a .gitignore, pero git statustodavía me informa sobre los cambios en los archivos en ese directorio. Lo intenté git rm -r --cached, pero eso lo elimina del repositorio remoto. ¿Cómo puedo dejar de rastrear cambios en este directorio, pero aún permitir que exista? También necesito hacer esto para 1 archivo, pero los cambios también aparecen git statusdespués .gitignorede ellos. ¿Qué tengo que hacer?

21312312
fuente
1
por favor escriba ¿cómo es exactamente su archivo .gitignore?
kdehairy

Respuestas:

183

En lugar de hacerlo .gitignore, puede actualizar el repositorio local de git ejecutando el siguiente comando:

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

En este caso, se está rastreando un archivo en el repositorio de origen. Puede modificarlo en su repositorio local y git nunca lo marcará como cambiado. Lee mas en:

ducin
fuente
22
Mi amor por git puede haberse duplicado.
Mark Fox
2
Esta debería ser la respuesta aceptada. Gracias por vincularte a eso.
Gowiem
4
¿Hay alguna forma de enviar esto al repositorio remoto?
Brian Ortiz
2
hmm prefiero marcar un archivo como "no es un archivo git, nunca sincronizarlo con git, incluso en otro repositorio de alguien"
fantastory
11
Puede revertirlo con git update-index --no-assume-unchanged <file>. Si desea enumerarlos git ls-files -v | grep '^h'.
Sanghyun Lee
12

Ignorar los cambios realizados en los archivos y permitir que existan es el propósito exacto de .gitignore. Entonces, agregar los archivos (o directorios) .gitignorees lo único que tiene que hacer.

Pero su problema es que git ya está rastreando los archivos que desea ignorar y .gitignoreno se aplica a los archivos rastreados. La única forma de detener este seguimiento es decirle a git que los elimine. Al usar git rm --cached, evita que git elimine sus archivos locales, pero cualquier otro repositorio que obtenga sus 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 se eliminarán.

Para evitar la eliminación de los demás repositorios, 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 --cachedlos archivos y confirmar antes de realizar los cambios. Git fusionará muy bien las dos eliminaciones sin tocar los archivos ya sin seguimiento.
Michaël Witrant
fuente
6
Eso no tiene por qué ser cierto ("detener el seguimiento = eliminar archivo"). Usted todavía puede tener un archivo de seguimiento en una cesión temporal y no ver los cambios realizados, utilizando: git update-index --assume-unchanged <file>. Echa un vistazo a: blog.pagebakers.nl/2009/01/29/…
ducin
esto resolvió mi problema porque necesito eliminar el archivo del repositorio insertado en git, git rm --cached <filename> -r y después de este push cambia al repositorie nuevamente para que se elimine el archivo
Vinicius Cardoso
7

Ponga /al final del nombre del directorio en su .gitignorearchivo, es decir

tmp/

Si ha rastreado archivos dentro de ese directorio, primero debe decirle a git que se olvide de ellos (antes de agregar el directorio a la lista de ignorados). Suponiendo que no tiene nada vital allí (es decir, que puede rayarlo):

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"

No se rastrearán los archivos nuevos en ese directorio.

La --cachedopción de git rmsolo funciona en el índice (cambios pendientes más o menos). No tiene ningún efecto sobre el árbol de trabajo o el estado de lo que se ha rastreado o no.

Estera
fuente
Yo tengo eso. Ambos the/dir/ythe/dir/*
21312312
Hola Mat, si tengo algo como / Media en diferentes carpetas que me gustaría ignorar, ¿es posible? Entonces, como / 1 / Media, / 2 / Media, ¿hasta como 99?
Nic
1

Parece que está intentando rastrear un archivo (por ejemplo index.php), agregarlo a un repositorio remoto, luego dejar de ver el seguimiento, mientras mantiene el archivo en el control remoto (es decir, mantenerlo index.phpsin cambios en el repositorio remoto mientras lo cambia localmente).

Por lo que tengo entendido, 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 realiza cambios en él. Si no rastrea un archivo, no existe en el repositorio remoto.

Debido a que no es posible hacer exactamente lo que desea con git, existen potencialmente otras soluciones, dependiendo de su situación exacta. Por ejemplo, ¿por qué no desea index.phpcambiar en remoto cuando lo cambia 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 edite index_template.php para que sea como desea que aparezca en el repositorio remoto. Agregue algo a su README para decirle a las personas que usan su repositorio que una vez que lo clonen, deben copiar index_template.php a index.php y editarlo para que se adapte 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 el suyo propio index.php. Usted ha hecho que sea fácil para ellos: simplemente copiar index_template.phpa index.phpy revisarlo con los ajustes específicos de la computadora.

Cypress Frankenfeld
fuente