2010-02-08 4 views
56

Ho diversi file .screen all'interno di /xxx/documentation e delle sue sottodirectory già monitorate da Git.git: Come posso aggiungere in modo ricorsivo tutti i file in una sottostruttura di directory che corrisponde a un modello glob?

Dopo aver modificato molti di questi file dello schermo, corro git add documentation/\\*.screen -come indicato dal primo esempio in git-add 's documentazione-mettere in scena questi file, ma il comando non riesce:

fatal: pathspec 'documentation/\*.screen' did not match any files

è il mio comando male, o ha un bug?

risposta

59

si tratta di un bug nella documentazione. Quota l'asterisco con

$ git add documentation/\*.screen

o

$ git add 'documentation/*.screen'

per ottenere il comportamento desiderato.

Se invece si desidera aggiungere i file nel solo la directory corrente, utilizzare

$ git add *.screen

UPDATE: ho presentato una patch che corregge il problema, now fixed a partire dalla versione 1.6.6.2.

+0

Questi due comandi portano allo stesso risultato? Che dire solo aggiungere file nella directory corrente ma non le sue sottodirectory? –

+0

A proposito, Kubi ha detto che il comando ha funzionato bene sulla sua macchina, cosa ne pensi? –

+0

@Phuong Sì, i due comandi portano allo stesso risultato. Per aggiungere solo file nella directory corrente, non citare l'argomento, (ad esempio, git add * .screen). Credo che Kubi e Aaron abbiano frainteso la tua domanda perché sono stato sorpreso di apprendere (grazie per avermi suggerito!) Che git-add ha questa caratteristica. –

1

provare

git add ./documentation/*.screen 
+0

Non è che il comando solo aggiungere file da ./documentation, non dalle sue sottodirectory? –

+0

Hai ragione. Ho appena provato il tuo comando originale sulla mia macchina e ha funzionato bene, però. – kubi

4

ti ha detto il guscio per cercare *.screen (vale a dire esattamente questa stringa - che non esiste - invece di ciò che si vuole "tutti i file che terminano con .screen). Omettere il \\ così il guscio può fare l'espansione nome di file per voi.

+0

In questo manuale, mi hanno detto di aggiungere il doppio backslash http://www.kernel.org/pub/software/scm/git/docs/git-add.html. Cosa rispondi? –

+0

Ho letto l'esempio e capisco cosa vogliono fare (ricorsiva) ma poi, perché il comando fallisce? L'errore suggerisce che non ci sono file con l'estensione ".screen" nella directory o che il pattern non viene espanso. –

+0

Bene, questo è strano, perché quando rimuovo le doppie barre posteriori il comando non produce errori. –

17

Ho provato la risposta accettata, ma non ha funzionato per me .. quindi ecco il mio nel caso in cui qualcuno volesse ottenere il suo lavoro senza dedicare del tempo a sezionare i vari aspetti che potrebbero causare il problema:

find documentation -name "*.screen" | xargs git add -u 

// l'opzione -u per git-add aggiunge per indicizzare solo i file che sono stati precedentemente monitorati e modificati

+0

Nel tuo caso, 'documentation' è il nome di una directory all'interno dell'albero di lavoro del repository o di un percorso relativo dall'esterno dell'albero di lavoro al livello superiore del repository? –

4

Questo quello che ho appena usato per un problema simile di git aggiungere tutti i file in una directory:

find . | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Per la domanda originale il comando sarà:

find -name "*.screen" | sed "s/\(.*\)/\"\1\"/g" | xargs git add 

Si noti che ho a che fare con il caso in cui un nome file completo specificato contiene spazi. Ecco perché la mia risposta. Modificare la parte prima del primo | per selezionare diversi file da aggiungere.

1

git add * .java funziona per me di aggiungere in modo ricorsivo tutti i file Java

+1

Wow, funziona anche per me! Ma solo se non ci sono file '.java' nella directory corrente. Se ci sono, solo questi file vengono aggiunti. –