.gitignore después de confirmar

210

Tengo un repositorio git alojado en Github. Después de cometer muchos archivos, me estoy dando cuenta de que necesito para crear .gitignorey excluir .exe, .objarchivos.

Sin embargo, ¿eliminará automáticamente estos archivos comprometidos del repositorio? ¿Hay alguna forma de forzar eso?

Madhur Ahuja
fuente
66
Los futuros googlers pueden encontrar esto extremadamente útil. Breve y al grano: git-tower.com/learn/git/faq/ignore-tracked-files-in-git
Austin Dean

Respuestas:

331

No, no puede forzar la eliminación de un archivo que ya está confirmado en el repositorio solo porque se agregó al .gitignore

Debe git rm --cachedeliminar los archivos que no desea en el repositorio. (- en caché ya que probablemente desee conservar la copia local pero eliminarla del repositorio). Entonces, si desea eliminar todos los exe de su repositorio, haga

git rm --cached /\*.exe

(Tenga en cuenta que el asterisco * se cita desde el shell; esto permite que git, y no el shell, expanda los nombres de ruta de los archivos y subdirectorios)

manojlds
fuente
66
@Madhur Ahuja En realidad, si lo hace git rm /\*.exe, eliminará todos los exe en su repositorio
manojlds
44
¿Para qué son los / \ 's?
Costa
55
@Costa están allí para escapar del asterisco, para evitar que el intérprete lo interprete, como está destinado git.
Lambart
2
Advertencia: los archivos se mantienen en local, es cierto ... Pero otros usuarios que ejecuten a git pullverán sus archivos eliminados.
ByScripts
42

Sin embargo, ¿eliminará automáticamente estos archivos comprometidos del repositorio?

No. Incluso con un .gitignorearchivo existente , puede organizar los archivos "ignorados" con el -findicador (forzar). Si los archivos ya están confirmados, no se eliminan automáticamente.

git rm --cached path/to/ignored.exe
KingCrunch
fuente
¿Eso significa que he eliminado individualmente cada .exe?
Madhur Ahuja
Probablemente pueda agrupar esto, pero no sé cómo funciona esto bajo Windows
KingCrunch
30

Si aún no ha presionado los cambios:

git rm -r --cached .
git add .
git commit -m 'clear git cache'
git push
slal
fuente
15

Tuve que eliminar .idea y las carpetas de destino y después de leer todos los comentarios, esto funcionó para mí:

git rm -r .idea
git rm -r target
git commit -m 'removed .idea folder'

y luego empujar para dominar

Emanuele
fuente
.ideafue mi problema, supongo que también fue tuyo:)
Olivier Pons
5

Sin embargo, ¿eliminará automáticamente estos archivos comprometidos del repositorio?

No.

La 'mejor' receta para hacer esto es usar git filter-branchcomo está escrito aquí:

La página de manual de git-filter-branch contiene ejemplos completos.

Nota Estarás reescribiendo el historial. Si ha publicado alguna revisión que contenga los archivos agregados accidentalmente, esto podría crear problemas para los usuarios de esas ramas públicas. Infórmeles, o tal vez piense qué tanto necesita eliminar los archivos.

Nota En presencia de etiquetas, use siempre la --tag-name-filter catopción para git filter-branch. Nunca está de más y te ahorrará el dolor de cabeza cuando te des cuenta de que lo necesitas

sehe
fuente
Ejecuté este comando que mostró Rewrite 57c1f1f04a3ed01f50c3260714cfc82c973ac816 (3/3) ADVERTENCIA: Ref 'refs / heads / master' no ha cambiado y no pasó nada
Madhur Ahuja
Es una advertencia, y muy probablemente significa que la rama maestra no contenía (todavía) ninguna revisión con los archivos que se eliminarán. Puedes verificar eso fácilmente. Si hay un problema, actualice la pregunta. PD: use - --allpara reescribir todas las ramas (locales) a la vez
sehe
1

Incluso después de eliminar los archivos y luego confirmarlos, todavía tendrá esos archivos en el historial. Para eliminarlos, considere usar BFG Repo-Cleaner . Es una alternativa a git-filter-branch.

Ceniza
fuente