Pregunta ¿Puede ignorar una línea específica?


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.


74
2017-07-02 14:00


origen


Respuestas:


Si su archivo es de un tipo específico, puede declarar un controlador de filtro de contenido, que puedes declarar en un .gitattributes archivo (como se presenta en la "Expansión de palabra clave" de "Git Atributos"):

http://git-scm.com/figures/18333fig0702-tn.png

*.yourType filter=yourFilterName

(Usted puede incluso establecer ese filtro para un archivo específico, si tu quieres)

Implementar:

  • yourFilterName.smudge (activado en git checkout) y

    git config --global filter.yourFilterName.smudge 'sed "s/isPhoneGap = .*/isPhoneGap = true/"'
    
  • yourFilterName.clean (activado en git add)

    git config --global filter.yourFilterName.clean 'sed "s/isPhoneGap = .*/isPhoneGap = false/"'
    

Su archivo aparecerá sin cambios en git status, sin embargo, su versión desprotegida tendría el valor correcto para isPhoneGap.


68
2018-03-04 11:56



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, mira el Git doc update-index para --[no-]assume-unchanged parámetro.

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.


33
2017-07-11 09:58



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 implementación (puedes versionar esos), y algún parámetro de tiempo de ejecución para el servidor que estés iniciando (como ./myserver --config=whatever.js)


6
2017-07-02 14:12



Así es como puedes hacerlo con filtros git:

  1. Crear / Abrir archivo de gitattributes:
    • <project root> /. gitattributes (se confirmará en repositorio)
      O
    • <project root> /. git / info / attributes (no se comprometerá con el repositorio)
  2. Agregue una línea que defina los archivos a filtrar:
    • *.rb filter=gitignore, es decir, filtro de ejecución denominado gitignore en todo *.rb archivos
  3. Definir el gitignore filtrar en su gitconfig:
    • $ 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.

Sólo git stash save "proj1-debug"  mientras el filtro está inactivo (solo deshabilítelo temporalmente en gitconfig o algo). De esta manera, mi código de depuración siempre puede ser git stash applya mi código en cualquier momento sin miedo a que estas líneas se hayan cometido accidentalmente.

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.


3
2018-04-26 20:36



Continuo https://stackoverflow.com/a/20574486/4935114, @Micro propuesto para crear un pre-commit gancho que lo hará 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í, echos una advertencia y exitestá con el código 1 entonces el proceso de compromiso no continuará.

Inspirado por @ La respuesta de Mike, Me encontré usando quizás una versión mejorada de su gancho que automáticamente  resets (con el -p flag) 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 esto pre-commit gancho 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 interactivo reset proceso. Así emulando a un usuario que presiona / buscar isPhoneGap, prensas y cuando se le preguntó si quería descartar este parche y finalmente presionó q para salir del interactivo reset.

El proceso de parche invertido interactivo está documentado aquí: https://git-scm.com/docs/git-add#git-add-patch


NOTA: El script anterior suponiendo que la variable interactive.singleKey es false. Si configuró el suyo para true, eliminar cualquier $'\n' desde el echo comando justo después de la advertencia.


3
2017-09-05 19:30



Un controlador de filtro de contenido no es una buena solución. Es posible que pueda ocultar esta línea de 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.


2
2018-05-28 07:54



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. Entonces puede usar Sugerencia de Carlos para marcar ese archivo solo como asumir sin cambios. De esta forma, no se pierden otros cambios en el archivo donde necesita verificar la configuración.

Esto puede permitirle ajustar las macros del preprocesador localmente (o para java algo como esto https://stackoverflow.com/a/1813873/1270965)


1
2018-03-07 19:52



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.


-1
2017-07-03 10:23