2012-05-04 9 views
15

Sto usando msysgit (1.7.9) e sto cercando l'invocazione corretta del comando git ls-files per mostrare solo i file e le directory (tracciati) al livello corrente, sia dall'indice, sia dal funzionamento corrente directory se è più facile.come `git ls-files` per un solo livello di directory.

In sostanza, si otterrebbe un elenco di directory simile a quello che si vedrebbe su Github. Venendo da Windows, non ho molta familiarità con il modo giusto di fare il globbing (?).

risposta

14

Penso che vogliate provare git ls-tree HEAD sedd. La seconda parola della produzione di ls-albero sarà tree per le directory, blob per i file, commit per submodulesm, il nome del file è tutto, dopo la scheda ascii

+1

'git ls-files | awk -F/'{print $ 1}' | uniq | xargs ls -dl --color = auto' – iegik

+0

@iegik Questo è molto meglio. I'd 'sed s, /. * ,,' invece di awk, solo perché è più corto. Fai una risposta, per favore? Lo lancerò. – jthill

+0

Non funziona su macOS - 'ls: opzione illegale - -'. Penso che tu voglia, almeno su macOS, '... | xargs 'ls' -Gdl' - qualcun altro può controllare se funziona anche su Linux? – ELLIOTTCABLE

12

Credo che git ls-tree --name-only [branch] farà quello che stai cercando.

+1

Grazie, è il 95% il modo in cui ci sono. Il tuo 'git ls-tree --name-only [branch]' elenca sia le directory che i file nella stessa lista (cioè senza il comando '/' per le directory). Ho trovato 'git ls-tree -d --name-only [branch]' elencherà solo le directory. Parte del "problema" è individuare le directory dei sottomoduli. –

+0

Probabilmente questa dovrebbe essere la risposta accettata! Quello, o è un ottimo inizio per uno. : D – ELLIOTTCABLE

+0

@PhilipOakley Stavo cercando di fare una cosa simile, tranne con 'git ls-files' piuttosto che' git ls-tree'. Con 'git ls-files', sembra che l'opzione equivalente sia' --directory' (in questo comando '-d' è l'abbreviazione di' --deleted'). –

3

Per elencare solo i file nella directory di lavoro corrente che vengono monitorate da git, ho trovato che il seguente è diverse volte più veloce rispetto all'utilizzo git ls-tree...:

ls | grep -f <(git ls-files) 

ci sarebbe voluto un po 'nei guai con sed se anche si volesse includere le directory, qualcosa sulla falsariga di:

ls | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq) 

assumendo che non si abbiano caratteri '/' nei nomi dei file. Così come ...

ls -a | grep -f <(git ls-files | sed 's/\/.*//g' | sort | uniq)

al fine di lista anche "invisibile" (non ancora rintracciato) file.

+0

Questo è bello ... Mi chiedo perché non riesco ad aggiungerlo come un '[alias]' ?? 'ls-tracked ="! f() {ls | grep -f <(git ls-files | sed 's /\/.*// g' sort | uniq);}; f "' -> 'fatale: file di configurazione errato –

4

git ls-tree <tree-ish> è buono e tutto, ma io non riesco a capire come specificare l'indice come <tree-ish>. (Anche se sono sicuro che ci Certamente alcuni all-protezioni Riferimento a fare proprio questo.)

In ogni caso, ls-files funziona implicitamente l'indice in modo potrei anche utilizzare tale:

$ git ls-files | cut -d/ -f1 | uniq 

Questo dimostra file e directory solo nella directory corrente.

Modificare l'argomento per controllare la profondità. Per esempio, -f-2 (che è trattino due) mostra i file e le directory fino a due livelli di profondità:

$ git ls-files | cut -d/ -f-2 | uniq 

se si specifica l'argomento <path>-ls-files, assicuratevi di aumentare -f per accogliere le directory principali:

$ git ls-files foo/bar | cut -d/ -f-3 | uniq 
+0

È possibile ottenere un albero per l'indice con ['git write-tree'] (https://git-scm.com/docs/git-write-tree). – jthill

0

Sono sorpreso che sia così difficile ... ma non farmi iniziare a parlare di git.

Una variante della risposta di jthill sembra essere aliasabile (hey, io sono un linguista, ho una licenza per fare nuove parole).La variante è

ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"` 

Questo utilizza 'ls' per formattare l'output, in modo da ottenere codifica dei colori (se si utilizza tale), ecc Funziona anche come un alias:

alias gitls='ls -d `git ls-tree HEAD | sed -e "s/^.*\t//"`' 

FWIW, puoi anche creare un alias del comando ricorsivo, in modo da utilizzare la formattazione "ls" (ad esempio se il percorso + i nomi dei file non sono troppo lunghi, otterrai due colonne di output, codifica dei colori dei file eseguibili, ecc.)

alias gitls-r='ls `git ls-files`' 
Problemi correlati