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 de git status
:
# modified: main/dontcheckmein.txt
# deleted: main/plzcheckmein.c
# deleted: main/plzcheckmein2.c
...
¿Hay alguna manera de hacerlo git add
pero simplemente ignorar el único archivo de texto que no quiero tocar? Algo como:
git add -u -except main/dontcheckmein.txt
main/*
, es necesario agregarlo--
delante para que git sepa que es un camino. Las otras dos variantes funcionan sin incluir los dos guiones. (Probado en el símbolo del sistema en Windows 7 con msysGit)git reset
para esas carpetas después seguirá funcionando, pero le tomará mucho tiempo agregar las carpetas grandes.1) Para comenzar a ignorar los cambios en un solo archivo ya versionado
y deshacer eso
git update-index --no-assume-unchanged "main/dontcheckmein.txt"
documentos de github para ignorar archivos
2) Para ignorar por completo un archivo único específico que impide que se cree en el repositorio
Primero, mira esta publicación de stackoverflow: Git global ignore no funciona
En
.gitignore
, agregue la ruta relativa al archivo sin guiar./
.Entonces, si su archivo está en
MyProject/MyFolder/myfile.txt
, (donde.git
también está en elMyProject
carpeta), agrégueloMyFolder/myfile.txt
a.gitignore
archivo .Puede confirmar qué reglas están asociadas con ignorar a través de
git check-ignore "MyFolder/myfile.txt"
Sobre ignorar global
Ese enlace habla
~/.gitignore_global
, pero el archivo está relacionado con su proyecto. Entonces, si pones el patrón de exclusiónMyFolder/myfile.txt
en~/.gitignore_global
, va a trabajar, pero no tendrá mucho sentido ...Por otro lado, si configura su proyecto con
git config core.excludesfile .gitignore
dónde.gitignore
estáMyProject
, el archivo local se anulará~/.gitignore_global
, lo que puede tener reglas muy útiles. ...Entonces, por ahora, creo que es mejor hacer un script para mezclarlo
.gitignore
con~/.gitignore_global
at.gitignore
.Una última 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 haga una copia de seguridad primero, ya que también se eliminará localmente! Puedes copiarlo más tarde ...fuente
git rm --cached MyFolder/myyfile.txt
para eliminar el archivo del repositorio pero mantenerlo localmente. Explicación en help.github.comPara un archivo
Para una carpeta
fuente
git add . && git reset -- main/*
?git push origin master
su próximo impulso, sologit push
y git sabrá que está en la rama maestra. Espero eso ayude.Ahora es
git
compatibleexclude certain paths and files
con la magia del camino:(exclude)
y su forma corta:!
. Para que pueda lograrlo fácilmente con el siguiente comando.En realidad puedes especificar más:
fuente
:!...
cláusulas para evitar que el shell se queje. Así, por ejemplo:git add --all -- ':!path/to/file1' ':!path/to/file2' ':!path/to/folder1/*'
.:!/path/to/(file1|file2)
?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 algunos seleccionados que mantengo listados en un archivo llamado
.gittrackignore
(muy similar a cómo funciona .gitignore).Y así es
.gittrackignore
como se ve mi actual .Estoy trabajando en un proyecto de Android que compilo desde la línea de comandos al implementar. Este proyecto depende de SherlockActionBar, por lo que debe ser referenciado en project.properties, pero eso se mete con la compilación, por lo que ahora solo escribo
gitadd
y agrego todos los cambios a git sin tener que quitar project.properties cada vez.fuente
--
era hasta tu comentario. Según las páginas del manual, es opcional y no cambia el resultado del comando (al menos en este caso). Esta pregunta parece apoyar eso, stackoverflow.com/questions/17800994/… . Corrígeme si me equivoco, pero parece que significa "tratar cualquier cosa después--
como argumentos, no como opciones / cambios"--
engit checkout
veo en esa pregunta. No sabía cuál era el doble guión hasta este intercambio nuestro también. Me pregunto si lagit checkout
ambigüedad entre ramas y archivos podría afectar, en esta o en una forma diferente,git reset
también.Para mantener el cambio en el archivo pero no para confirmar, hice esto
git add .
git reset -- main/dontcheckmein.txt
git commit -m "commit message"
para verificar que el archivo está excluido
git status
fuente
Use
git add -A
para agregar todos los archivos modificados y recién agregados a la vez.Ejemplo
fuente
fuente
Prueba esto:
fuente
Para el caso específico de la pregunta, la forma más fácil sería agregar todos los archivos con extensión .c y omitir todo lo demás:
Desde git-scm (o / y
man git add
):Tenga en cuenta que esto significa que también podría hacer algo como:
para agregar todos los archivos (que no se ignoran) que están en la
main
carpeta. Incluso puedes enloquecer con patrones más elaborados:Lo anterior agregará todos los archivos que están en la
s(any char)c
carpeta y tienenService
algún lugar en su nombre de archivo.Obviamente, no está limitado a un patrón por comando. Es decir, puede pedirle a git que agregue todos los archivos que tengan una extensión de .c y .h :
Este enlace puede darle algunas ideas más de patrones globales.
Me resulta particularmente útil cuando estoy haciendo muchos cambios, pero todavía quiero que mis compromisos se mantengan atómicos y reflejen un proceso gradual en lugar de una mezcolanza 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 necesite citar sus patrones globales para que funcionen, pero este nunca fue el caso para mí.
fuente
Utilizo
git add --patch
bastante y quería algo como esto para evitar tener que golpear dtodo el tiempo a través de los mismos archivos. Creé un par de alias git muy extravagantes para hacer el trabajo:En mi caso, solo quería 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.fuente
Cambios a realizar: (use "git reset HEAD ..." para quitar el escenario)
fuente
Puedes probar esto:
git add * && git reset main/dontcheckmein.txt
fuente