2010-07-15 28 views
45

Comencé a usar git con un proyecto xcode y recientemente descubrí que puedo usar archivos .gitignore y .gitattributes para ignorar el ruido del compilador y el sistema. Ahora que tengo los archivos .gitignore y .gitattributes en su lugar, ¿cómo puedo "aplicar" las nuevas reglas de ignorar y deshacerme del crud del control de versiones?Aplicar las reglas de git .gitignore a un repositorio existente

Mi archivo .gitignore es:

# xcode noise 
*.modelv3 
*.pbxuser 
*.perspective 
*.perspectivev3 
*.pyc 
*~.nib/ 
build/* 

# Textmate - if you build your xcode projects with it 
*.tm_build_errors 

# old skool 
.svn 

# osx noise 
.DS_Store 
profile 

Y mi archivo .gitattributes es:

*.pbxproj -crlf -diff -merge 

Gracias!

+2

+1 El enlace en el comentario de Chris aquí funcionó mejor para mí que cualquier cosa en esta página. – Jorin

+0

** No no no, ** [esta es la manera correcta] (http://stackoverflow.com/a/7532131/288906). La mayoría de las respuestas sugeridas vuelven a comprometer TODOS los archivos. –

Respuesta

37

uso git rm --cached para archivos y git rm -r --cached para el directorio build/

+23

Si bien * exacto *, llegué de Google y encontré una respuesta * inútil * porque así es cómo hacerlo un archivo a la vez. Mucho más útil y eficiente sería una respuesta como la de Chris Johnsen que le dice cómo matar a todos los archivos que deben ser ignorados en un solo paso. –

+4

Esta es una respuesta mejor: http://stackoverflow.com/a/1139797/743957 –

+0

Esto no tiene que ser un archivo a la vez. Ejecute 'git rm -r --cached *' para purgar todo. – cbartondock

-1

No debería tener que 'aplicar' los cambios. simplemente coloque el archivo .gitignore en su directorio de inicio (si desea que sea global) o en la raíz de su proyecto (si desea que sea exclusivo solo para ese proyecto).

Editar: Se me ocurre que puede tener este problema porque ha agregado los archivos que no desea rastrear. Esto es lo que la página man de gitignore tiene que decir al respecto:

Tenga en cuenta que todos los archivos de gitignore se refieren realmente a los archivos que aún no han sido rastreados por git; para ignorar los cambios no confirmados en los archivos ya rastreados, consulte la documentación de git update-index --assume-unchanged.

+0

Las personas a las que no les gusta esta respuesta ... por favor ofrezcan comentarios sobre por qué no les gusta. No es útil simplemente rechazarlo sin una razón. –

10

Si ya está realizando el seguimiento archivos que desea ignorar, usted tiene que quitar con

git rm --cached <file> 

Git no hará caso de los archivos que ya se realiza un seguimiento (es decir, que los agregó con git add).

+0

Este comando siempre establece el archivo como eliminado para mí .... –

+0

@MladenDanic Eso está bien, git está diciendo que ve el archivo como eliminado. El archivo no se eliminará en realidad debido al operador '--cached', pero git efectivamente lo ve como eliminado ahora. –

+0

Pero si no me equivoco, lo eliminará del repositorio remoto, ¿verdad? –

1

mv the_file_i_want_to_ignore the_file_i_want_to_ignore.back

git rm the_file_i_want_to_ignore

mv the_file_i_want_to_ignore.back the_file_i_want_to_ignore

git status

git commit -m 'ignore a bunch of stuff i should have ignored before'

esto un poco de un flujo de trabajo manual, pero su forma en que he hecho esto en el pasado.

+6

Realmente quieres usar 'git rm --cached'. –

1

Si desea eliminar los archivos por completo, entonces aquí hay un handy reference from Github.

se advirtió que:

  1. Esto reescribir su historia, por lo que es probable que sólo vale la pena hacer antes de publicar el repositorio.
  2. Recuerda que los viejos shas seguirán estando en la base de datos de objetos, pero la guía a la que he vinculado te mostrará cómo manejarlos también.
62

Aquí es una forma de “untrack” los archivos que están de otra manera serían ignorados en el marco del conjunto actual de excluir patrones:

(GIT_INDEX_FILE=some-non-existent-file \ 
git ls-files --exclude-standard --others --directory --ignored -z) | 
xargs -0 git rm --cached -r --ignore-unmatch -- 

Esto deja los archivos en el directorio de trabajo, pero los elimina de la índice.

El truco utilizado aquí es proporcionar un archivo de índice inexistente a git ls-files para que piense que no hay archivos rastreados. El código de shell anterior solicita todos los archivos que se ignorarían si el índice estuviera vacío y luego los elimina del índice real con git rm.

vez que los archivos han sido “sin seguimiento”, usar git status para verificar que nada importante fue eliminado (si lo que ajustar sus patrones de excluir y utilizar git reset -- path para restaurar la entrada de índice eliminado). Luego haz un nuevo commit que deje fuera el "crud".

El "crud" seguirá estando en los commits anteriores. Puede usar git filter-branch para producir versiones limpias de los commits antiguos si realmente necesita un historial limpio (nb usando git filter-branch "reescribirá el historial", por lo que no debería tomarse a la ligera si tiene colaboradores que hayan extraído de sus confirmaciones históricas después de la "crud" fue primero introducido).

+1

Esta solución tiene más sentido para mí: http://stackoverflow.com/questions/1139762/ gitignore-file-not-ignoring – wbarksdale

+0

¿Cómo se ejecuta este comando? Pegarlo en un terminal da el error '-bash: git: comando no encontrado', sin embargo, puedo ejecutar comandos git en ese directorio. – memmons

+0

@Answerbot: ¿Qué dice 'type git'? Parece que es un alias (¿o función de shell?). El hecho de que 'git' no es solo un comando externo normal para usted está causando que el shell falle cuando se combina con la asignación temporal de variables de entorno (por ejemplo' FOO = bar git ... 'no expande su alias' git', y su PATH no tiene 'git'). Cualquiera de los dos también fallaría con * xargs * ya que * xargs * está ejecutando sus comandos por sí mismo, sin usar el shell para hacerlo. O necesita "expandir" sus usos de * git * para hacer coincidir su alias/función, o usar un script de envoltura externo que agrupa los mismos efectos. –

Cuestiones relacionadas