git - remove - ¿Puede ignorar una línea específica?
git tag best practices (8)
Así es como puedes hacerlo con los filtros de git :
- Crear / Abrir archivo de gitattributes:
- <project root> /. gitattributes (se confirmará en repositorio)
O - <project root> /. git / info / attributes (no se comprometerá con el repositorio)
- <project root> /. gitattributes (se confirmará en repositorio)
- Agregue una línea que defina los archivos a filtrar:
-
*.rb filter=gitignore
, es decir, filtro de ejecución llamadogitignore
en todos los archivos*.rb
-
- Defina el filtro
gitignore
en sugitconfig
:-
$ git config --global filter.gitignore.clean "sed ''/#gitignore$/''d"
, es decir, eliminar estas líneas -
$ git config --global filter.gitignore.smudge cat
, es decir, no hacer nada al extraer el archivo del repositorio
-
Notas:
Por supuesto, esto es para archivos ruby, aplicados cuando una línea termina con #gitignore
, aplicado globalmente en ~/.gitconfig
. Modifique esto como lo necesite para sus propósitos.
¡¡Advertencia!!
Esto deja su archivo de trabajo diferente del repositorio (por supuesto). ¡Cualquier revisión o actualización significará que estas líneas se perderán! Este truco puede parecer inútil, ya que estas líneas se pierden repetidamente al momento del check out, rebase o pull, pero tengo un caso de uso específico para poder usarlo.
Solo git stash save "proj1-debug"
mientras el filtro está inactivo (solo deshabilítelo temporalmente en gitconfig
o algo así). De esta forma, mi código de depuración siempre se puede git stash apply
en mi código en cualquier momento sin temor a que alguna vez estas líneas sean accidentalmente comprometidas.
Tengo una idea posible para resolver estos problemas, pero intentaré implementarla en otro momento.
Gracias a Rudi y jw013 por mencionar filtros y gittributes git.
Estoy usando git para sincronizar con phonegap mientras pruebo en el navegador nativo del teléfono. Como tal, tengo la siguiente línea:
var isPhoneGap = false;
Obviamente, modifico esto cuando construyo, pero ¿hay alguna manera de configurar Git para ignorar esta línea o tengo que ir y ponerla en su propio archivo e ignorarla de esa manera?
Estoy usando Gitx y el terminal en OSX 10.6.
Continuando con https://.com/a/20574486/4935114 , @Mike propuso crear un @Mike pre-commit
que grep
en los archivos por etapas para las líneas que uno podría querer ignorar. El anzuelo comprueba si esas líneas fueron puestas en escena. Si es así, muestra una advertencia y exit
con el código 1
para que el proceso de confirmación no continúe.
Inspirado por https://.com/a/20574486/4935114 , me encontré usando quizás una versión mejorada de su gancho que reset
automáticamente s (con el indicador -p
) la línea específica que queremos ignorar.
No estoy seguro de que este gancho funcione para una situación en la que tenga muchos archivos con esta línea para ignorar, pero este buildVars.java
busca un cambio en esta línea en un archivo específico buildVars.java
. El script de gancho se veía así cuando lo probé en mi máquina.
#!/bin/sh
# this hook looks for lines with the text `var isPhoneGap = false;` in the file `buildVars.java` and it resets these lines to the previous state before staged with `reset -p`
if [[ $(git diff --no-ext-diff --cached buildVars.java | grep --count -e "var/ isPhoneGap[/ ]*=[/ ]*") -ne 0 ]]; then
cat <<EOW
WARNING: You are attempting to commit changes which are not supposed to be commited according to this /`pre-commit/` hook
This /`pre-commit/` hook will reset all the files containing this line to it''s previous state in the last commit.
EOW
echo /$''/n''isPhoneGap$''/n''y$''/n''q | git reset -p
# BONUS: Check if after reseting, there is no actual changes to be commited and if so, exit 1 so the commit process will abort.
if [[ $(git diff --no-ext-diff --cached | wc -l) -eq 0 ]]; then
echo there are no actual changes to be commited and besides the change to the variable /'isPhoneGap/' so I won/'t commit.
exit 1
fi
fi
Explicación
Lo que hice fue hacer eco de una secuencia de control que busca la expresión regular isPhoneGap
durante un proceso de reset
interactivo. Así, emulando a un usuario que pulsa /
para buscar es isPhoneGap
, presiona y
cuando se le pregunta si quiere descartar este parche y finalmente presiona q
para salir del reset
interactivo.
El proceso de parche invertido interactivo está documentado aquí: https://git-scm.com/docs/git-add#git-add-patch
NOTA: El script anterior supone que la variable interactive.singleKey
es false
. Si configuró el suyo en true
, elimine cualquier $''/n''
del comando echo
justo después de la advertencia.
Gitx debería permitirle comprometer o ignorar líneas individuales (tal vez ya lo sepa), pero tendría que hacer eso cada vez que se comprometa. Creo que sería mejor tener un archivo de configuración por destino de despliegue (puede versionar esos), y algún parámetro de tiempo de ejecución para el servidor que esté iniciando (como ./myserver --config=whatever.js
).
Nop. Solo puede ignorar archivos individuales (y más) ya que las líneas en .gitignore coinciden con los nombres de archivo y no con el contenido del archivo. Ya ha mencionado la solución a esto, es decir, ignora un solo archivo que contiene ese contenido que desea ignorar.
Puedes usar
git update-index --assume-unchanged [file]
ignorar los cambios de un archivo que no desea rastrear. Uso esta solución cuando necesito tener un archivo en el repositorio, pero este archivo tiene algunas partes que cambian y que no necesito rastrear siempre.
Cuando el archivo tenga cambios que son importantes, debe hacer esto:
git update-index --no-assume-unchanged [file]
Además, consulte el índice de actualización de Git doc para el parámetro --[no-]assume-unchanged
.
Cuando se especifican estos indicadores, los nombres de los objetos registrados para las rutas no se actualizan. En cambio, estas opciones establecen y desarman el bit "asumir sin cambios" para las rutas. Cuando el bit "asumir sin cambios" está activado, git deja de verificar los archivos del árbol de trabajo para posibles modificaciones, por lo que debe desarmar manualmente el bit para indicarle a git cuando cambie el archivo de árbol de trabajo.
Si su archivo es de un tipo específico, puede declarar un controlador de filtro de contenido , que puede declarar en un archivo .gitattributes
(como se presenta en la "Expansión de palabra clave" de " Atributos de Git "):
*.yourType filter=yourFilterName
(Incluso puede establecer ese filtro para un archivo específico , si lo desea)
Implementar:
yourFilterName.smudge
(activado engit checkout
) ygit config --global filter.yourFilterName.smudge ''sed "s/isPhoneGap = .*/isPhoneGap = true/"''
yourFilterName.clean
(activado engit add
)git config --global filter.yourFilterName.clean ''sed "s/isPhoneGap = .*/isPhoneGap = false/"''
Su archivo aparecerá sin cambios en el git status
, pero su versión desprotegida tendrá el valor correcto para isPhoneGap
.
Supongo que esto podría ser algo que aparezca en más de una línea de tu fuente.
Creo que sería más limpio tener un archivo .userbuildconfig de algún tipo que acaba de incluir y que tenga los valores predeterminados marcados. Luego, puede usar la sugerencia de Carlos para marcar ese archivo solo como suponer sin cambios. De esta forma, no se pierden otros cambios en el archivo donde necesita verificar la configuración.
Esto puede permitirle ajustar localmente las macros del preprocesador (o para java algo como esto https://.com/a/1813873/1270965 ).
Un controlador de filtro de contenido no es una buena solución. Es posible que puedas ocultar esta línea del git status
/ etc, pero en realidad no se ignora. Tan pronto como cambie el valor, su directorio de trabajo se marcará sucio aunque el cambio no sea visible.
Si realmente desea que esta línea deje de estar en el control de la versión, cambiarla a un argumento de línea de comando o colocarla en un archivo de inclusión o compilación ignorado puede ser el único medio práctico.