git - tipos - ¿Agregar todos los archivos a un commit excepto un solo archivo?
tipos de etiquetas en git (10)
Ahora git
admite exclude certain paths and files
mediante pathspec magic :(exclude)
y su forma corta:! . Así que puedes lograrlo fácilmente como el siguiente comando.
git add --all -- :!main/dontcheckmein.txt
git add -- . :!main/dontcheckmein.txt
En realidad se puede especificar más:
git add --all -- :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
git add -- . :!path/to/file1 :!path/to/file2 :!path/to/folder1/*
Tengo un montón de archivos en un conjunto de cambios, pero quiero ignorar específicamente un solo archivo modificado. Se ve así después git status
:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
¿Hay alguna manera de hacer git add
pero simplemente ignorar el archivo de texto que no quiero tocar? Algo como:
git add -u -except main/dontcheckmein.txt
Cambios que se deben confirmar: (use "git reset HEAD ..." para anular el escenario)
Para el caso específico de la pregunta, la forma más sencilla sería agregar todos los archivos con la extensión .c y omitir todo lo demás:
git add *.c
Desde git-scm (o / y man git add
):
git añadir <pathspec> ...
Archivos para agregar contenido de. Se pueden dar fileglobs (por ejemplo, * .c) para agregar todos los archivos coincidentes. <...>
Tenga en cuenta que esto significa que también podría hacer algo como:
git add **/main/*
para agregar todos los archivos (que no se ignoran) que están en la carpeta main
. Incluso puedes enloquecer con patrones más elaborados:
git add **/s?c/*Service*
Lo anterior agregará todos los archivos que están en s(any char)c
carpeta s(any char)c
y tienen Service
en algún lugar de su nombre de archivo.
Obviamente, no está limitado a un patrón por comando. Es decir, podría pedirle a git que agregue todos los archivos que tengan la extensión .c y .h :
git add *.c *.h
Este link podría darte más ideas de patrones globales.
Me resulta particularmente útil cuando estoy realizando muchos cambios, pero aún quiero que mis compromisos sean atómicos y reflejen un proceso gradual en lugar de un montón de cambios en los que puedo estar trabajando en ese momento. Por supuesto, en algún momento, el costo de crear patrones elaborados supera el costo de agregar archivos con métodos más simples, o incluso un archivo a la vez. Sin embargo, la mayoría de las veces puedo identificar fácilmente los archivos que necesito con un patrón simple y excluir todo lo demás.
Por cierto, es posible que deba citar sus patrones globales para que funcionen, pero este nunca fue el caso para mí.
Prueba esto:
git checkout - main / dontcheckmein.txt
Si bien Ben Jackson tiene razón, pensé que agregaría también cómo he estado usando esa solución. A continuación se muestra un script muy simple que uso (al que llamo gitadd) para agregar todos los cambios, excepto unos pocos seleccionados que sigo enumerando en un archivo llamado .gittrackignore
(muy similar a cómo funciona .gitignore).
#!/bin/bash
set -e
git add -A
git reset `cat .gittrackignore`
Y así es como se ve mi actual .gittrackignore
.
project.properties
Estoy trabajando en un proyecto de Android que compilo desde la línea de comandos cuando lo implemento. Este proyecto depende de SherlockActionBar, por lo que necesita ser referenciado en project.properties, pero eso confunde con la compilación, así que ahora solo gitadd
y agrego todos los cambios a git sin tener que des-agregar project.properties cada vez. .
Use git add -A
para agregar todos los archivos modificados y recién agregados a la vez.
Ejemplo
git add -A
git reset -- main/dontcheckmein.txt
Uso git add --patch
bastante y quería algo como esto para evitar tener que golpear d todo el tiempo a través de los mismos archivos. Saqué un par de alias git muy piratas para hacer el trabajo:
[alias]
HELPER-CHANGED-FILTERED = "!f() { git status --porcelain | cut -c4- | ( [[ /"$1/" ]] && egrep -v /"$1/" || cat ); }; f"
ap = "!git add --patch -- $(git HELPER-CHANGED-FILTERED ''min.(js|css)$'' || echo ''THIS_FILE_PROBABLY_DOESNT_EXIST'' )"
En mi caso, solo quise ignorar ciertos archivos minificados todo el tiempo, pero podría hacer que use una variable de entorno como $GIT_EXCLUDE_PATTERN
para un caso de uso más general.
1) Para comenzar a ignorar los cambios en un solo archivo ya versionado
git update-index --assume-unchanged "main/dontcheckmein.txt"
y para deshacer ese git update-index --no-assume-unchanged "main/dontcheckmein.txt"
2) Ignorar completamente un único archivo específico que impide que se cree en el repositorio
Primer vistazo a este Git global ignorar no funciona
y en .gitignore
agregue la ruta relativa al archivo sin encabezar ./
así que si su archivo está en MyProject/MyFolder/myfile.txt
(donde .git
también está en MyProject
), en .gitignore
solo coloque este MyFolder/myfile.txt
puede confirmar qué regla está relacionada con la omisión con git check-ignore "MyFolder/myfile.txt"
Acerca de ignorar global
Ese enlace habla sobre ~/.gitignore_global
; pero el archivo está relacionado con su proyecto; entonces, si pones el patrón de exclusión MyFolder/myfile.txt
en ~/.gitignore_global
, funcionará pero no tendrá mucho sentido ...
Por otro lado, si configura su proyecto con git config core.excludesfile .gitignore
donde .gitignore
está en MyProject
; esa configuración anulará ~/.gitignore_global
que puede tener reglas muy útiles ...
Entonces, por ahora, creo que lo mejor es crear un script para mezclar tu .gitignore
con ~/.gitignore_global
en .gitignore
.
Una ultima advertencia
Si el archivo que desea ignorar ya está en el repositorio, este método no funcionará a menos que haga esto: git rm "MyFolder/myfile.txt"
, ¡pero primero haga una copia de seguridad ya que se eliminará localmente! Puedes copiarlo de nuevo más tarde ...
Para un archivo
git add -u
git reset -- main/dontcheckmein.txt
Para una carpeta
git add -u
git reset -- main/*
git add -u
git reset -- main/dontcheckmein.txt