git aggiunge solo le modifiche modificate e ignora i file non monitorati


658

Ho eseguito "git status" e di seguito sono elencati alcuni file che sono stati modificati / o sotto l'intestazione "modifiche non messe in scena per il commit". Ha anche elencato alcuni file non tracciati che voglio ignorare (ho un file ".gitignore" in queste directory).

Voglio mettere in scena i file modificati in modo da poterli commettere. Quando ho eseguito "git add.", Ha aggiunto i file modificati E i file che voglio ignorare nella gestione temporanea.

Come posso aggiungere solo i file modificati e ignorare i file non tracciati se presentati con lo stato git di seguito.

Inoltre, i miei file ".gitignore" funzionano correttamente?

$ git status
# On branch addLocation
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   someProject/path/domain/viewer/LocationDO.java
#       modified:   someProject/path/service/ld/LdService.java
#       modified:   someProject/path/service/ld/LdServiceImpl.java
#       modified:   someProject/path/web/jsf/viewer/LocationFormAction.java
#       modified:   someProject/war/WEB-INF/classes/message/viewer/viewer.properties
#       modified:   someProject/war/page/viewer/searchForm.xhtml
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       .metadata/
#       someProject/build/
no changes added to commit (use "git add" and/or "git commit -a")

1
se hai aggiunto il file .gitignore DOPO aver tracciato i file, il file .gitignore non ignorerà i file che sono già stati tracciati. potrebbe essere un problema.
BKSpurgeon,

Risposte:


904

Idealmente .gitignoredovresti impedire che i file non tracciati (e ignorati) vengano mostrati nello stato, aggiunti usando git addecc. Quindi ti chiederei di correggere il tuo.gitignore

Puoi farlo in git add -umodo che metterà in scena i file modificati ed eliminati.

Puoi anche fare il git commit -acommit solo dei file modificati ed eliminati.

Nota che se hai Git della versione precedente alla 2.0 e l' git add .hai usato , allora dovresti usare git add -u .(Vedi " Differenza di" git add -A"e" git add ." ").


74
punto di interesse, questo ( add -u) non aggiunge solo i modified file, ma "aggiunge" deletedquelli .. qualcosa che attualmente sto cercando di prevenire.
Zach Lysobey,

6
Per aggiungere solo file modificati, di solito vado in cima alla directory principale del mio repository e digito for fil in $(git diff --name-only --relative); do git add $fil; done. Se dovessi usarlo molto (non lo faccio), farei semplicemente un alias per questo nel mio ~/.bashrcfile. Questo, ovviamente, funziona solo in bash.
Krøllebølle,

8
Nessuna risposta definita, solo risposte "lavora per la maggior parte delle persone"? Devo usare un altro processo per farlo correttamente? In che modo questo non è integrato in git add? Sembra una cosa così comune voler fare.
Samuel,

2
nb i metodi menzionati in questi commenti falliranno se si hanno nomi di file dispari (spazi, asterischi, cosa no). Per sfuggire correttamente a tutti i file con nomi strani, utilizzare:IFS=$(echo -en "\n\b"); for file in $(git diff --name-only); do git add "$file"; done
nomi

3
git add -uè l'abbreviazione di git add --updateed git commit -aè l'abbreviazione digit commit --all
Hugo

96

Questo ha funzionato per me:

#!/bin/bash

git add `git status | grep modified | sed 's/\(.*modified:\s*\)//'`

O ancora meglio:

$ git ls-files --modified | xargs git add

Non hai bisogno di raggruppare (()) se non hai intenzione di riutilizzare il gruppo, e ho lasciato spazio bianco davanti al nome del file per me. In questo caso, ciò non influirà sul risultato finale, ma per motivi di esempio, ecco il comando sed che ho usato: sed 's /.* modified: * //'. Verificato su Mac OS X 10.9.5.
Samuel,

@Samuel Grouping è utile quando si verifica l'espressione. Quindi posso stampare la corrispondenza tra parentesi quadre per vedere che ho ragione.
user877329

1
@ Ярослав la tua soluzione aggiunge file modificati e non tracciati ed è uguale a git add -u, quindi non risponde alla domanda.
Nick Volynkin,

7
- modificato sembra includere sia cancellato che appena modificato
DMart

2
git diff-files -z --diff-filter = M - solo nome | | xargs -0 git add --dry-run sembra funzionare bene.
DMart

10
git commit -a -m "message"

-a: include tutti i file attualmente modificati / eliminati in questo commit. Tieni presente, tuttavia, che i file (nuovi) non tracciati non sono inclusi.

-m: imposta il messaggio di commit


4

Non hai detto ciò che è attualmente tuo .gitignore, ma un .gitignorecon i seguenti contenuti nella directory principale dovrebbe fare il trucco.

.metadata
build

3
Stavo usando il mio .gitignore tutto sbagliato. Avevo un file .gitignore vuoto in ogni directory che volevo ignorare invece di avere un singolo gitignore con contenuto.
Steve,

1
@Steve: funzionerebbe se ciascuno di essi. gitognoreconteneva un inizio (ignora tutto). Ma un singolo .gitignorenella directory superiore è in genere molto più semplice da usare e sufficiente.
maaartinus,

2

Mi è capitato di provare questo in modo da poter vedere prima l'elenco dei file:

git status | grep "modified:" | awk '{print "git add  " $2}' > file.sh

cat ./file.sh

eseguire:

chmod a+x file.sh
./file.sh 

Modifica: (vedi commenti) Questo potrebbe essere ottenuto in un solo passaggio:

git status | grep "modified:" | awk '{print $2}' | xargs git add && git status

1
Ciò potrebbe essere ottenuto in un solo passaggio:git status | grep modified | awk '{print $2}' | xargs git add && git status
Choylton B. Higginbottom,

Sì, avrei dovuto fornire anche quella soluzione, grazie, ho aggiornato il post.
Mike Q,

1

Non sono sicuro che si tratti di una funzionalità o di un bug, ma ha funzionato per noi:

git commit '' -m "Message"

Nota l'elenco di file vuoto ''. Git lo interpreta per eseguire il commit di tutti i file tracciati modificati, anche se non sono messi in scena, e ignora i file non tracciati.


Questo sicuramente non funziona quando si usa --amend.
GhostCat

1

Per mettere in scena file modificati ed eliminati

git add -u

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.