Git: elimina los files de la historia que nombraron como una opción CLI

Accidentalmente agregué un file enorme a mi repository (~ 250 MB) con el nombre --exclude . Este file se generó en OS X mientras escribía un nuevo código para este repository. Ahora, estaba intentando aprender a eliminarlo de la historia de Git desde aquí y aquí . Los tutoriales son agradables y claros, pero el problema es que Git "piensa" --exclude no es un file sino una opción.

Cuando ejecuto este command:

  git filter-branch \
     --index-filter "git rm -r --cached --ignore-unmatch ' --exclude ' " HEAD 

Git se queja:

 error: unknown option `exclude' usage: git rm [<options>] [--] <file>... 

Traté de usar el número de sha del file, pero no cambió nada. ¿Cuál es la forma correcta de eliminar dichos files?

La forma común de UNIX de build una línea argumental es

 <command> <keys&arguments> [--] <arguments> 

En tu caso

 command: git rm keys: -r --cached --ignore-unmatch arguments: '--exclude' 

Por lo general, las teclas son detectadas por los protagonistas.

Pero siempre puedes forzar moverlos a arguments escribiéndolos explícitamente en los arguments parte de la línea usando -- Entonces obtienes

 git filter-branch --index-filter "git rm -r --cached --ignore-unmatch -- '--exclude' " HEAD 

Intente al less separar las opciones de git rm de los parameters del file, usando un ' -- ' (doble guión)

  git filter-branch --index-filter "git rm -r --cached --ignore-unmatch -- '--exclude' " HEAD ^^ (double-hyphen) 

Consulte más sobre la syntax de doble guión en " Eliminar una twig git mal llamada ".

La forma recomendada de hacer esto es usar el separador como se ve en las respuestas de VonC y Lol4t0 y poner el nombre del file después de él.

Pero usar comodines para evitar la --… parte de --exclude , como sugiere Lasse en un comentario , también funciona, ya que Git parece hacer su propia expansión de comodín, independientemente del caparazón.

Si solo lo estuvieras usando en una sola git rm manual, tendrías que

  • escapinglo:

     git rm -r --cached --ignore-unmatch \*exclude 

    o

  • citarlo

     git rm -r --cached --ignore-unmatch '*exclude' 

    o

  • borre el file real primero

     rm ./--exclude git rm -r --cached --ignore-unmatch *exclude 

para que el shell ya no realice la expansión y el comodín pase a Git. Pero en

 git filter-branch \ --index-filter "git rm -r --cached --ignore-unmatch *exclude" HEAD 

el command interno completo se cita de todos modos, y git filter-branch no parece invocar el intérprete de commands para interpretarlo, por lo que funciona tal cual. (El uso con commands nesteds es probablemente la razón por la cual Git implementa su propia expansión de comodines).