2009-03-01 12 views
10

Qualcuno sa di un impianto idraulico git (sicuramente non in porcellana) i mezzi di determinare se:git Programmatico stato

  • ci sono modifiche nel repo dall'ultima commit, e
  • se TESTA locale è davanti origine/HEAD

Sto cercando di determinare questo programmaticamente, da qui il desiderio di non risolvere questo con porcellana e vari sed-fu.

risposta

9

Aggiornamento: come mentioned below da toupeira, è possibile utilizzare l'opzione --porcelain di git status (dal commettere 6f15787, settembre 2009, Git 1.7.0).

ho già detto nella mia risposta "What does the term porcelain mean in Git?" che:

Forse il significato di --porcelain qui è "produrre un output adatto per il consumo da parte degli script di porcellana"

Tuttavia, che non lo farà mostra l'informazione avanti/indietro: vedi "What to add to “git status --porcelain” to make it behave like “git status”?": per quello, avresti ancora bisogno di usare altri comandi: vedi "How to know if git repository has changes that have not been synchronized with server?"


risposta iniziale marzo 2009

Al comando di porcellana, un:

$ git diff HEAD 

ti dà le modifiche dall'ultima commit (quello che si commetterebbe se si esegue "git commit -a") .

Una possibile equivalente al comando idraulico sarebbe:

$ git ls-files -m 

messa in vendita di tutto modificato (directory di lavoro o di un indice) file


Se si crea il repository clonando repository di qualcun altro, il il ramo "master" remoto viene copiato su un ramo locale denominato "origine". Ottieni il tuo ramo "principale" che non è legato al repository remoto.

C'è sempre una testa corrente, nota come HEAD. (Questo è in realtà un collegamento simbolico, .git/HEAD, in un file come refs/teste/master.)

eseguire "git status" e analizzare l'output:

# On branch master 
# Your branch is ahead of 'origin/master' by 11 commits. 
# 

Maggiori dettagli nel SO domanda "Why is Git telling me “Your branch is ahead of ‘origin/master’ by 11 commits.” and how do I get it to stop?"

possibile equivalente al comando idraulico:

* git-for-each-ref 

della messa in vendita impegna tutti, ma richiede analisi della produzione, nonché ...

Ancora, git ls-files could be used to produced the same result than a git status.

git ls-files --exclude-per-directory=.gitignore --exclude-from=.git/info/exclude \ 
        --others \ 
        --modified \ 
        -t 
+0

È grandioso. Grazie mille. –

+5

"git ls-files --exclude-standard ..." sarebbe un po 'più semplice. –

2

git status ora ha un argomento --porcelain per gli script (come alternativa -z per l'analisi della macchina), questo è preferibile git ls-files che non mostra file aggiunti all'indice.

+0

Da [la documentazione per '--porcelain'] (https://www.kernel.org/pub/software/scm/git/docs/git-status.html):" Dai l'output in un facile analizza il formato per gli script, è simile allo short output, ma rimarrà stabile nelle versioni git e indipendentemente dalla configurazione dell'utente. " –

+0

Tuttavia, non è chiaro dalle note di rilascio su quando è stato aggiunto il flag '--porcelain'. –

+0

L'ho trovato! Ho cercato il log Git con 'git log --grep" --porcelain "--date-order', e mostrano che il flag è stato aggiunto in commit [' 6f15787181a163e158c6fee1d79085b97692ac2f'] (https://github.com/git/ git/commit/6f15787181a163e158c6fee1d79085b97692ac2f) il 5 settembre 2009. Incidentalmente, 'tag git - contiene 6f15787 | ordina -V | less' rivela che questo non è stato effettivamente rilasciato in una versione stabile fino alla v1.7.0, che era il [12 febbraio 2010] (https://github.com/git/git/commit/e923eaeb901ff056421b9007adcbbce271caa7b6). –

Problemi correlati