git: Come ignorare tutti i file non tracciati presenti?


131

Esiste un modo pratico per ignorare tutti i file e le cartelle non monitorati in un repository git?
(So ​​di .gitignore.)

Quindi git statusfornirebbe di nuovo un risultato pulito.



Oppure potresti voler aggiungere un singolo * al tuo file .gitignore. :)
vilicvane

1
*Molto probabilmente una volontà non è quella che vuoi.
sjas,


Sorpreso da così tante risposte errate. -u noè sbagliato. -unoè corretto. -u noprova a fare uno stato su un file chiamato no! Il noè non un argomento a -u. Per forzare noad essere interpretato come un argomento -u, non ci deve essere spazio. Per testarlo, fai touch Invalide confronta git status -uInvalidcon git status -u Invalid.
Aaron McDaid

Risposte:


251

Come già detto, per escludere dallo stato basta usare:

git status -uno  # must be "-uno" , not "-u no"

Se invece desideri ignorare permanentemente i file attualmente non tracciati, puoi avviare dalla radice del tuo progetto:

git status --porcelain | grep '^??' | cut -c4- >> .gitignore

Ogni chiamata successiva a git statusignorerà esplicitamente quei file.

AGGIORNAMENTO : il comando sopra ha un piccolo inconveniente: se non hai .gitignoreancora un file il tuo gitignore si ignorerà da solo! Ciò accade perché il file .gitignoreviene creato prima git status --porcelaindell'esecuzione. Quindi se non hai .gitignoreancora un file ti consiglio di usare:

echo "$(git status --porcelain | grep '^??' | cut -c4-)" > .gitignore

Questo crea una subshell che si completa prima della .gitignorecreazione del file.

SPIEGAZIONE DEI COMANDI poiché sto ottenendo molti voti (grazie!) Penso che dovrei spiegare un po 'il comando:

  • git status --porcelainviene utilizzato anziché git status --shortperché gli stati del manuale "Forniscono l'output in un formato facile da analizzare per gli script. È simile all'output breve, ma rimarrà stabile tra le versioni di git e indipendentemente dalla configurazione dell'utente." Quindi abbiamo sia la parseability che la stabilità;
  • grep '^??'filtra solo le righe che iniziano con ??, che, secondo il manuale di stato git , corrispondono ai file non tracciati;
  • cut -c4- rimuove i primi 3 caratteri di ogni riga, il che ci dà solo il percorso relativo al file non tracciato;
  • i |simboli sono pipe , che passano l'output del comando precedente all'input del comando seguente;
  • i simboli >>e >sono operatori di reindirizzamento , che aggiungono l'output del comando precedente a un file o sovrascrivono / creano un nuovo file, rispettivamente.

UN ALTRO VARIANTE per coloro che preferiscono usare alsed posto di grepe cut, ecco un altro modo:

git status --porcelain | sed -n -e 's/^?? //p' >> .gitignore

3
cut -c4- rimuove i primi 4 caratteri di ogni riga, che ci fornisce solo il percorso relativo al file non tracciato; No. -csegna l'inizio di un elenco di numeri di colonna da tagliare. E 4- seleziona la linea dalla colonna 4 alla fine, che taglia le colonne 1-3. Quindi il tuo comando di taglio rimuove effettivamente i primi 3 caratteri di ogni riga. Se hai rimosso 4 caratteri da una riga di stato git come quella per questo file qui ?? app/views/static_pages/contact.html.erb:, rimuoveresti la prima lettera di app. Quindi il comando è corretto, ma la spiegazione è errata.
7

@ 7stud: grazie, hai ragione, ne ho scritti 4 per errore. Ho risolto la risposta.
Diego,

2
Apprezzo molto la spiegazione del comando. È bello sapere cosa stanno facendo i comandi casuali che ho copiato da Internet e ci aiuta tutti a imparare come usare la riga di comando e git meglio.
Eric Fitting

1
-u nonon funziona per me. Ma lo -unofa. Ho aggiornato la risposta di conseguenza. Questo è uno strano design per Git. Sono su git 1.7.1
Aaron McDaid

2
@AaronMcDaid: grazie. Il cambiamento è documentato qui e discusso qui
Diego

51

Se si desidera ignorare permanentemente questi file, un modo semplice per aggiungerli .gitignoreè:

  1. Passa alla radice dell'albero git.
  2. git ls-files --others --exclude-standard >> .gitignore

Ciò enumera tutti i file all'interno di directory non monitorate, che possono essere o meno ciò che desideri.


3
Perché questo non ottiene così tanti voti? Non c'è bisogno di passare attraverso altri 2 programmi!
JoelFan,

4
@JoelFan: due motivi: 1) questo funziona solo dalla radice di git , mentre quello accettato funziona da ogni sottodirectory, devi solo modificare il .gitignorepercorso di destinazione 2) se hai una directory non tracciata, questa elenca ognuna e ogni singolo file al suo interno, ma non la directory non tracciata stessa (quindi non ignorerai la directory, e quindi riceverai comunque i file futuri segnalati nella directory come non tracciati, mentre quello accettato elenca solo la directory e non i file non tracciati all'interno Questa è una questione di cosa vuoi fare, ma spesso vuoi semplicemente ignorare l'intera regia
Diego,

1
Grazie Poolie Apprezzo la differenza del tuo suggerimento a causa dei punti menzionati da @Diego Ho iniziato a lavorare con una libreria di file e cartelle e non voglio tracciare / inviare i file originali. Voglio solo tenere traccia dei file che aggiungo o ricostruisco nella libreria. L'aggiunta delle cartelle principali ignorerebbe tutto. Questa / la tua soluzione ha aggiunto tutti i 1696 file in un attimo. xD
Chaos7703,

Questo può essere ottenuto anche usando git config status.showUntrackedFiles no.
Larsch,

16

L'ho trovato nel manuale

Il parametro mode viene utilizzato per specificare la gestione di file non monitorati. È facoltativo: il valore predefinito è tutto e, se specificato, deve essere bloccato sull'opzione (es. -Uno, ma non -u no).

git status -uno


39
Bene, se tutti avrebbero RTFM prima di pubblicare, nessuno di noi avrebbe mai avuto un rappresentante :-)
Jenny D

4

Due strade:

usa l'argomento "-uno" per git-status. Ecco un esempio:

[jenny@jenny_vmware:ft]$ git status
# On branch ft
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       foo
nothing added to commit but untracked files present (use "git add" to track)
[jenny@jenny_vmware:ft]$ git status -uno
# On branch ft
nothing to commit (working directory clean)

Oppure puoi aggiungere i file e i direttori a .gitignore, nel qual caso non verranno mai visualizzati.


2
Un modo pratico di modificare l' .gitignoreessere git status | cat >> temp && vim temp. Quindi modificando il file in modo da eliminare le prime poche righe e l'ultima riga, nonché il trailing #e lo spazio bianco dopo di esso. Poi cat temp >> .gitignore && rm temp. Nel caso in cui non .gitignorefosse presente prima, mv temp .gitignorelo farà. Roba brutta ma meglio dell'aggiornamento .gitignoremanuale.
sabato

1
Questa risposta non è corretta La risposta corretta è -uno. Se lo usi -u no, è equivalente a no -u: farà uno stato su un file chiamato no(che probabilmente non esiste) e utilizzerà la -umodalità predefinita . cioè è equivalente agit status no
Aaron McDaid

3

-u nonon mostra neanche file non messi in scena. -unofunziona come desiderato e mostra non messo in scena, ma si nasconde non tracciato.


1
Anche questo non è del tutto corretto. git status -u Xè equivalente a git status X -u( Xnon è un argomento per -u). Questo, a sua volta, è equivalente a git status X(perché -usenza un argomento è l'impostazione predefinita -u). Pertanto, è semplicemente uno stato git su file X. Quindi, se Xè nosi cerca semplicemente di fare un git status su un file chiamato no, che probabilmente non hanno
Aaron McDaid

2

Nel caso in cui non ti trovi su Unix come OS, questo funzionerebbe su Windows usando PowerShell

git status --porcelain | ?{ $_ -match "^\?\? " }| %{$_ -replace "^\?\? ",""} | Add-Content .\.gitignore

Tuttavia, il .gitignorefile deve avere una nuova riga vuota, altrimenti aggiungerà del testo all'ultima riga, indipendentemente dal fatto che abbia contenuto.

Questa potrebbe essere un'alternativa migliore:

$gi=gc .\.gitignore;$res=git status --porcelain|?{ $_ -match "^\?\? " }|%{ $_ -replace "^\?\? ", "" }; $res=$gi+$res; $res | Out-File .\.gitignore


1

Se hai molti file non tracciati e non vuoi " gitignore" tutti, nota che, a partire da git 1.8.3 (22 aprile 2013) , git statusmenzioneremo --untracked-files=noanche se non hai aggiunto quell'opzione nel primo posto!

" git status" suggerisce agli utenti di utilizzare l' --untracked=noopzione quando impiega troppo tempo.


0

Sono venuto qui cercando di risolvere un problema leggermente diverso. Forse questo sarà utile a qualcun altro:

Creo una nuova filiale feature-a . come parte di questo ramo creo nuove directory e ho bisogno di modificare .gitignore per sopprimerne alcune. Questo accade molto quando si aggiungono nuovi strumenti a un progetto che creano varie cartelle cache. .serverless, .terraformecc.

Prima di essere pronto a ricollegarlo al padrone ho qualcos'altro, quindi controllo master , ma ora git statusriprendo di nuovo quelle cartelle soppresse, dal momento che .gitignore non è stato ancora unito.

La risposta qui è in realtà semplice, anche se ho dovuto trovare questo blog per capirlo:

Basta controllare il file .gitignore dal feature-aramo

git checkout feature-a -- feature-a/.gitignore
git add .
git commit -m "update .gitignore from feature-a branch"
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.