Git: elenca solo file “non tracciati” (anche, comandi personalizzati)


339

C'è un modo per usare un comando come git ls-filesmostrare solo file non tracciati?

Il motivo per cui lo sto chiedendo è perché utilizzo il seguente comando per elaborare tutti i file eliminati:

git ls-files -d | xargs git rm

Vorrei qualcosa di simile per i file non tracciati:

git some-command --some-options | xargs git add

Sono stato in grado di trovare l' -oopzione git ls-files, ma questo non è quello che voglio perché mostra anche i file ignorati. Sono stato anche in grado di trovare il seguente comando lungo e brutto:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

Sembra che ci debba essere un comando migliore che posso usare qui. E se non lo è, come posso creare comandi git personalizzati?


Potresti spiegare perché ne hai bisogno git ls-files -d | xargs git rm?
Takeshin,

Ciò rimuove tutti i file che mancano agli avvisi git. La mia domanda era su come eseguire un'operazione correlata: aggiungere tutti i file che git non sta attualmente monitorando. Di solito farei entrambi questi dopo aver rinominato, combinato e / o diviso i miei file di codice.
Siamo tutti Monica il

Se mancano, non sono già stati eliminati? A meno che ... non ti sei ritirato da qualche altra parte e poi stai cercando di sincronizzarti con il telecomando ... Penso di averlo capito.
Buttle Butkus,

Ho testato tutte le risposte, se c'è una cartella vuota non tracciata, nessuno può trovarla.
kittygirl,

@kittygirl questo è corretto. Poiché gitfunziona solo su file, non ha alcun modo di tracciare cartelle vuote. Prova find . -type d -emptyinvece.
Siamo tutti Monica

Risposte:


531

Per elencare i file non tracciati prova:

git ls-files --others --exclude-standard

Se è necessario reindirizzare l'output xargs, è consigliabile ricordare gli spazi bianchi utilizzando git ls-files -ze xargs -0:

git ls-files -z -o --exclude-standard | xargs -0 git add

Simpatico alias per l'aggiunta di file non tracciati:

au = !git add $(git ls-files -o --exclude-standard)

Modifica: per riferimento: git-ls-files


7
Perfetto! Cosa !significa all'inizio della riga dell'alias o dove è documentato?
Siamo tutti Monica il

@takeshin Come ottenere solo i nomi delle directory principali? non sottocartelle. Significa in questi file non tracciati: / P / a / files, / P / a / images, / P / a / / P /, ... - Voglio solo elencare / P /
Dr.jacky

2
In quale situazione avresti bisogno dell'alias però? git add *farà la stessa cosa: aggiungere tutti i file non monitorati escluso lo standard (file in cui sono coperti i percorsi .gitignore).
Toinetoine,

1
Preferisco che il mio alias funzioni in modo coerente in tutte le directory nel repository (il comando ls-files mostra solo i file modificati nella struttura corrente), quindi ho[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
qneill

Grazie. Buon commento
Darth Egregious,

71

Se desideri solo rimuovere i file non tracciati, procedi come segue:

git clean -df

aggiungere xa questo se si desidera includere anche file specificamente ignorati. Io uso git clean -dfxun sacco per tutta la giornata.

Puoi creare git personalizzato semplicemente scrivendo uno script chiamato git-whatevere avendolo nel tuo percorso.


È molto più comune che io voglia aggiungere tutti i file non tracciati (ad esempio, dopo aver spostato alcune cose). In ogni caso, grazie per il suggerimento sui comandi personalizzati. Dove è documentato quel meccanismo?
Siamo tutti Monica il

5
Basta fare git add -Ao git add -u(a seconda di ciò che ha più senso per te)
Dustin

1
Il tuo commento è la vera risposta, che viene ripetuta anche in seguito da @Mike Lococo
andho

2
e "git clean -dfxn" per una corsa a secco aggiungendo "n"
charo,

50

git add -A -nfarà quello che vuoi. -Aaggiunge tutti i file non tracciati al repository, lo -nrende un punto in dry-runcui l'aggiunta non viene eseguita ma viene fornito l'output dello stato in cui sono elencati tutti i file che sarebbero stati aggiunti.


7
Questa è un'ottima risposta! Si noti che esclude i file nei .gitignorefile, che di solito è ciò che vogliamo, ma in caso contrario git add -fAn,.
cdunn2001,

1
Questa sembra la risposta migliore.
Rob Grant,

1
Questa è la risposta migliore. Indica esplicitamente all'utente cosa farebbe (senza farlo) e dà la possibilità di rivederlo prima di aggiungerlo effettivamente. Perfetto. Grazie!
digitguy

Elenca anche i file modificati.
Frank-Rene Schäfer,

bello, ma ho capito avvolto: add '$file'. Considerando che git ls-files --exclude-standard -ofornisce un output nudo, tubazioni calde.
iperpallium

28

La risposta accettata si arresta in modo anomalo sui nomi dei file con spazio. A questo punto non sono sicuro di come aggiornare il comando alias, quindi inserirò qui la versione migliorata:

git ls-files -z -o --exclude-standard | xargs -0 git add

Penso che questa sia la risposta corretta, perché fornisce il percorso di ciascun file per eseguire un'azione (come git add) in seguito
Pablo Burgos,

27

È tutto molto semplice

Per ottenere un elenco di tutti i file non tracciati utilizzare il comando git status con l' opzione -u (--untracked-files)

git status -u

che ne dici di una versione non ricorsiva?
David,

Sfortunatamente, elenca anche i file ignorati attraverso i file .gitignore.
Plouff

8
Questa è l'unica risposta che ha mostrato i miei file ignorati al commit iniziale, ma ho dovuto aggiungere --ignoredal git status -ucomando
DN

Questo è semplice e carino.
Eric Wang,

1
Questo mostra anche i file modificati. Quindi, non una risposta alla domanda: mostra solo i file non monitorati.
Carattere jolly

6

Quando si cercano file da aggiungere potenzialmente. L'output lo git showfa ma include anche molte altre cose. Il seguente comando è utile per ottenere lo stesso elenco di file ma senza tutte le altre cose.

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

Ciò è utile quando combinato in una pipeline per trovare i file che corrispondono a un modello specifico e quindi eseguirne il piping git add.

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

6

So che è una vecchia domanda, ma in termini di elenco dei file non monitorati ho pensato di aggiungerne un altro che elenca anche le cartelle non monitorate:

È possibile utilizzare l'operazione git clean con -n (esecuzione a secco) per mostrare quali file rimuoverà (inclusi i file .gitignore):

git clean -xdn

Questo ha il vantaggio di mostrare tutti i file e tutte le cartelle che non vengono tracciate. parametri:

  • x - Mostra tutti i file non tracciati (incluso ignorato da git e altri, come output di compilazione ecc ...)
  • d - mostra directory non tracciate
  • n- e soprattutto ! - dryrun, cioè non cancellare nulla, basta usare il meccanismo clean per visualizzare i risultati.

Può essere un po 'pericoloso farlo in questo caso in cui si dimentica -n. Quindi di solito lo alias in git config.


2

Tutte le risposte precedenti che ho controllato avrebbero elencato anche i file da impegnare. Ecco una soluzione semplice e facile che elenca solo i file che non sono ancora nel repository e non sono soggetti .gitignore.

git status --porcelain | awk '/^\?\?/ { print $2; }'

o

git status --porcelain | grep -v '\?\?'

questo non sembra funzionare bene con i file che hanno uno spazio nel loro nome
ssc

-2

Penso che questo sarà lo stesso del poster originale previsto:

git add .


2
Ogni volta che lo fai git/svn add ., il gattino muore.
Nakilon,

Heh, solo se hai un mucchio di trapianto nelle tue copie locali di filiali remote;) Crea filiali locali e puoi git add .impunemente!
Tim Fulmer,

@Nakilon, ecco perché si configura .gitignorecorrettamente. Comunque buono da evitare git add ., comunque. È meglio git add -u.
Carattere jolly
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.