Come sapere se un file è tracciato git (dal codice di uscita della shell)?


357

C'è un modo per sapere se un file viene monitorato eseguendo un gitcomando e controllando il suo codice di uscita?

In altre parole: git tracking è un file?


Penso che il punto sia: quali sono i criteri per decidere un file come tracciato o non tracciato. Dovrebbe esserci un qualche tipo di raccolta di file tracciati da cercare.
smwikipedia,

Risposte:


443

provare:

git ls-files --error-unmatch <file name>

uscirà con 1 se il file non viene tracciato


Almeno con la mia vecchia versione (1.6.0) di git, è necessario mettere l' --error-unmatchopzione prima del nome del file per ottenere un errore. In qualche modo l'opzione viene applicata solo ai nomi dei file che la seguono.
Alex Dupuy,

In realtà, il problema sembra essere che l'opzione GNU getopt che permuta non è abilitata e quando appare dopo un nome di file (o dopo --) --error-unmatchviene trattata come un altro nome di file (non nell'indice) e non ha alcun effetto.
Alex Dupuy,

29
git ls-files | grep <PATTERN>? esempio:git ls-files | grep Main.h
gaussblurinc

1
[Un modo ingenuo] Apporta una piccola modifica al file (aggiungi / rimuovi uno spazio). E vedere se il file viene elencato quando si digita 'git status'. Un modo sciocco, ma può risparmiare tempo.
BraveNinja,

Ma l'ho aggiunto e lo commetto con il comando "git add -A && git commit -m" blah ". Anche vedere interi file con il comando" git ls-tree --name-only -r sha1 ".
Dr.jacky,

66

Se non vuoi ingombrare la tua console con messaggi di errore, puoi anche eseguire

git ls-files file_name

e quindi controllare il risultato. Se git non restituisce nulla, il file non viene tracciato. Se è tracciato, git restituirà il percorso del file.

Questo è utile se si desidera combinarlo in uno script, ad esempio PowerShell:

$gitResult = (git ls-files $_) | out-string
if ($gitResult.length -ne 0)
{
    ## do stuff with the tracked file
}

Penso che file_namedebba essere una corrispondenza esatta (percorso completo + nome file), ma può essere utilizzato con caratteri jolly:git ls-files *foo.rb
dechimp

16

MODIFICARE

Se hai bisogno di usare git da bash c'è --porcelainun'opzione per git status:

--porcellana

Fornisci l'output in un formato stabile e di facile analisi per gli script. Attualmente questo è identico all'output --short, ma è garantito che non cambierà in futuro, rendendolo sicuro per gli script.

L'output è simile al seguente:

> git status --porcelain
 M starthudson.sh
?? bla

O se fai solo un file alla volta:

> git status --porcelain bla
?? bla

ORIGINALE

fare:

git status

Vedrai un rapporto che indica quali file sono stati aggiornati e quali non sono stati rintracciati.

Puoi vedere che bla.shviene monitorato e modificato e newblanon monitorato:

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#
#       modified:   bla.sh
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       newbla
no changes added to commit (use "git add" and/or "git commit -a")

Scusa, avrei dovuto essere più chiaro. Lo stato è a posto ma preferirei controllare un codice di uscita piuttosto che analizzare l'output.
Dale Forester

git status --porcelainè tuo amico se hai bisogno di analizzare l'output per script, dai un'occhiata al documento collegato che mostra alcune altre opzioni utili
stefanB

Ciao, non funziona con Git molto vecchio: git status --porcelain error: unknown option la versione della porcellana è 1.6.0 :-)
Laryx Decidua,

@ user465139 che è corretto ... hai bisogno di git 1.7.0 o più recente (l'opzione porcellana non è stata aggiunta fino ad allora).
mason81,

13

Prova a eseguire git statusil file. Stamperà un errore se non è tracciato da git

PS$> git status foo.txt
error: pathspec 'foo.txt' did not match any file(s) known to git.

Wow. Devo averlo eseguito su una directory e ha funzionato come se stesse controllando l'intero repository. Grazie.
Dale Forester

4
In realtà, se corro git status trackedfileottengo il codice di uscita 1 (si prevede che 0 sia utile) ma non mi dà "errore:" nell'output. Preferirei analizzare un codice di uscita piuttosto che l'output di stringa.
Dale Forester

43
Trovo che non venga generato alcun errore se eseguo git status su un file che esiste nella mia copia di lavoro git ma che è escluso da .gitignore. (Vale a dire questa risposta non farà.)
JellicleCat

Si noti che non funziona bene se il file si trova nell'elenco ignora, ovvero nel file.gitignore
Robin Hsu,

8
Non funziona Stampa sempre la stessa cosa, anche se il file non esiste. $ git status notthere:On branch master nothing to commit, working directory clean
Chloe,

6

Non conosco alcun comando git che fornisca un codice di uscita "errato", ma sembra un modo semplice per farlo sarebbe quello di utilizzare un comando git che non fornisce alcun output per un file che non è tracciato, come git-log o git-ls-files. In questo modo non è necessario eseguire alcuna analisi, è possibile eseguirlo attraverso un'altra semplice utility come grep per vedere se c'è stato un output.

Per esempio,

git-ls-files test_file.c | grep.

uscirà con un codice zero se il file viene tracciato, ma un codice di uscita uno se il file non viene tracciato.


3

Ti suggerisco un alias personalizzato su di te.gitconfig .

Devi fare il modo di fare:

1) Con il comando git:

git config --global alias.check-file <command>

2) Modifica ~/.gitconfige aggiungi questa riga nella sezione alias:

[alias]
    check-file = "!f() { if [ $# -eq 0 ]; then echo 'Filename missing!'; else tracked=$(git ls-files ${1}); if [[ -z ${tracked} ]]; then echo 'File not tracked'; else echo 'File tracked'; fi; fi;  };  f"

Una volta avviato il comando (1) o il file salvato (2), nell'area di lavoro è possibile testarlo:

$ git check-file
$ Filename missing 

$ git check-file README.md
$ File tracked 

$ git check-file foo
$ File not tracked

2

l'utilizzo git logfornirà informazioni al riguardo. Se il file viene rintracciato in git, il comando mostra alcuni risultati (registri). Altrimenti è vuoto.

Ad esempio se il file è tracciato git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
commit ad9180b772d5c64dcd79a6cbb9487bd2ef08cbfc
Author: User <someone@somedomain.com>
Date:   Mon Feb 20 07:45:04 2017 -0600

    fix eslint indentation errors
....
....

Se il file non è tracciato git,

root@user-ubuntu:~/project-repo-directory# git log src/../somefile.js
root@user-ubuntu:~/project-repo-directory#

1

Solo i miei due centesimi:

git ls-files | grep -x relative/path

dove relative/pathpuò essere facilmente determinato premendo taball'interno di una shell di completamento automatico. Aggiungi un ulteriore | wc -l per ottenere un output 1 o 0.


A seconda del percorso (ad es. Se contiene un punto), è necessario aggiungere grepun'opzione --fixed-strings.
EndlosSchleife il
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.