No creo que una confirmación de Git pueda registrar una intención como "detener el seguimiento de este archivo, pero no lo elimine".
La habilitación de tal intención requerirá la intervención fuera de Git en cualquier repositorio que se fusione (o rebase) en una confirmación que elimine el archivo.
Guardar una copia, aplicar eliminación, restaurar
Probablemente, lo más fácil es decirles a los usuarios intermedios que guarden una copia del archivo, eliminen y luego restauren el archivo. Si están tirando a través de rebase y están 'llevando' modificaciones al archivo, obtendrán conflictos. Para resolver tales conflictos, use git rm foo.conf && git rebase --continue
(si la confirmación en conflicto tiene cambios además de los del archivo eliminado) o git rebase --skip
(si la confirmación en conflicto solo ha cambiado en el archivo eliminado).
Restaurar archivo como no rastreado después de extraer un commit que lo elimina
Si ya han retirado su confirmación de eliminación, aún pueden recuperar la versión anterior del archivo con git show :
git show @{1}:foo.conf >foo.conf
O con git checkout (por comentario de William Pursell; ¡pero recuerda volver a eliminarlo del índice!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Si han tomado otras medidas desde que eliminaste la eliminación (o si presionan con rebase en un HEAD separado), es posible que necesiten algo más que no sea @{1}
. Podrían usar git log -g
para encontrar la confirmación justo antes de que retiraran su eliminación.
En un comentario, usted menciona que el archivo que desea "destrabar, pero mantener" es algún tipo de archivo de configuración que se requiere para ejecutar el software (directamente desde un repositorio).
Mantener el archivo como 'predeterminado' y activarlo manual / automáticamente
Si no es completamente inaceptable para seguir manteniendo el contenido del archivo de configuración en el repositorio, es posible que pueda cambiar el nombre del archivo de seguimiento a partir de (por ejemplo) foo.conf
a foo.conf.default
y luego indicar a los usuarios que cp foo.conf.default foo.conf
después de aplicar el cambio de nombre cometió. O, si los usuarios ya usan alguna parte existente del repositorio (por ejemplo, un script o algún otro programa configurado por el contenido en el repositorio (por ejemplo, Makefile
o similar)) para iniciar / implementar su software, puede incorporar un mecanismo predeterminado en el inicio / proceso de despliegue:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Con un mecanismo de este tipo morosos en su lugar, los usuarios deben ser capaces de tirar de una confirmación de que cambia el nombre foo.conf
a foo.conf.default
sin tener que hacer ningún trabajo adicional. Además, evita tener que copiar manualmente un archivo de configuración si realiza instalaciones / repositorios adicionales en el futuro.
Reescribir el historial requiere intervención manual de todos modos ...
Si es inaceptable mantener el contenido en el repositorio, es probable que desee erradicarlo completamente del historial con algo como esto git filter-branch --index-filter …
. Esto equivale a reescribir la historia, lo que requerirá una intervención manual para cada rama / repositorio (ver sección “Recuperación de aguas arriba Rebase” en el git rebase página del manual ). El tratamiento especial requerido para su archivo de configuración sería solo otro paso que uno debe realizar mientras se recupera de la reescritura:
- Guarde una copia del archivo de configuración.
- Recuperarse de la reescritura.
- Restaurar el archivo de configuración.
Ignórelo para evitar la recurrencia
Independientemente del método que utilice, es probable que desee incluir el nombre de archivo de configuración en un .gitignore
archivo en el repositorio para que nadie pueda git add foo.conf
volver a darse cuenta sin darse cuenta (es posible, pero requiere -f
/ --force
). Si tiene más de un archivo de configuración, puede considerar 'moverlos' a un solo directorio e ignorar todo (al 'mover' me refiero a cambiar el lugar donde el programa espera encontrar sus archivos de configuración y obtener los usuarios (o el mecanismo de lanzamiento / despliegue) para copiar / mover los archivos a su nueva ubicación; obviamente no querrá colocar un archivo en un directorio que ignorará).