2012-01-12 16 views
6

Ho uno script di shell in cui voglio controllare uno dei miei repository git. Voglio sapere se quel repos ha tutto impegnato e se viene spinto a padroneggiare. Prima di questo test, faccio git fetch per assicurarmi di avere le ultime modifiche.Verifica che il repository git locale abbia eseguito il commit e sia stato inviato al master

ho trovato il modo per verificare se il repo ha alcune modifiche non:

if ! git --work-tree=$HOME/git/project --git-dir=$HOME/git/project/.git diff-index --quiet HEAD --; then 
    echo "Has some changes"; 
fi 

Ma questa non è l'unica cosa che ho bisogno. Voglio anche assicurarmi che tutti i miei commit locali su vengano inviati al master.

Qual è il modo più semplice per farlo?

risposta

-1

Dalla grande risposta di Mark Longair ho capito che è possibile controllare lo che il repository git locale ha tutto il commit e il push, ma è necessario eseguire i comandi per farlo.

Ho scritto una piccola sceneggiatura che fa tutto ciò e scrivo in modo gentile quello che è successo a .

$ is_git_synced ~/git/* --only_errors 
Error: path '/home/bessarabov/git/Dancer' has staged changes 
Error: path '/home/bessarabov/git/Ubic' has some divergences with remote 'origin' 

Ed è anche possibile utilizzare il codice di uscita per scoprire se tutto si impegna e spinto o meno.

È a Github: https://github.com/bessarabov/App-IsGitSynced e su CPAN: https://metacpan.org/module/App::IsGitSynced

+0

Mark Longair's e la tua soluzione sembrano mancare i file non tracciati. Quindi, a seconda del tuo scopo, la directory può ancora essere considerata sporca. –

+0

@ vlad-didenko forse non ti sturo, ma la mia soluzione mostra file non tracciati. Screenshot: http://upload.bessarabov.ru/bessarabov/LbYgP0Daba-oJ5vCDa8Wag8a5H8.png e il codice che lo rende: https://metacpan.org/source/BESSARABV/App-IsGitSynced-1.0.0/bin/is_git_synced# L84 – bessarabov

+0

Sì, credo che non sia abbastanza chiaro. I comandi "git diff --exit-code && git diff --cached --exit-code" non catturano i file non tracciati. La tua soluzione è una grande (relativamente) sceneggiatura che non è certo una risposta alla domanda "metodo più semplice per fare" sopra - una domanda che richiede chiaramente alcuni semplici comandi. Come qualcuno che è venuto qui dalla ricerca non vedo una risposta - come passare attraverso un considerevole script perl non è una (buona) risposta. Forse è lì, ma non qui :) –

5

È possibile controllare che tutto si impegna con:

git diff --exit-code && git diff --cached --exit-code 

In una configurazione tipica, su una spinta di successo per un master nel origin, il ramo a distanza-tracking origin/master sarà aggiornato. Così, per verificare se hai spinto tutte le modifiche, è possibile verificare se:

git rev-parse --verify master 

... è lo stesso:

git rev-parse --verify origin/master 
8

Un modo molto semplice per farlo sarebbe quello di semplicemente chiamare

git push -n

(il "-n" è l'abbreviazione di "dry-run", il che significa che invece di fare la spinta, ti dirà invece cosa avrebbe spinto)

Se dice "Tutto aggiornato", hai già spinto tutto all'origine.

In alternativa, ti fornirà un elenco di tutti i commit che non sono stati ancora spinti all'origine.

O se ci sono modifiche all'origine che non hai ancora abbattuto, allora potrebbe lamentarsi di possibili fusioni che potrebbero essere causate da una spinta (questo duplica il "ha alcune modifiche" che controlla che stai già facendo)

+1

Se ci si trova in un ramo locale, questo fornisce "Tutto aggiornato". Anche se nulla su questo ramo è spinto. – BetaRide

1

Dopo un git fetch, per controllare se ci sono commit locali nel ramo che non sono stati spinti ad un telecomando, provate questo:

git diff --exit-code <remote>/<branch>..<branch> 

Questo ti dirà anche se nel telecomando ci sono dei commit che non hai localmente. Si noti che questo è solo il controllo delle modifiche, quindi se ci dovessero essere commit diversi con identiche modifiche nel remoto e nel ramo locale, è possibile che questo comando non lo rilevasse. In uno script, di solito lo inserisco su /dev/null e controllo lo stato di ritorno. Quindi, supponendo che il telecomando è origin e la vostra filiale è master, il comando sarebbe simile a questa:

git diff --exit-code origin/master..master > /dev/null 

Come altri hanno suggerito, ho anche usare git diff --exit-code e git diff --cached --exit-code per verificare la presenza di modifiche non locali.

Problemi correlati