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.