2010-01-19 5 views
4

Ce script python est le meilleur que j'ai trouvé jusqu'à présent. Je l'ai juste piraté ensemble et, lors d'une première utilisation superficielle, semble agir correctement, mais je ne peux pas m'empêcher de penser qu'il existe un moyen plus simple de le faire ou même quelque chose intégré (bien que j'ai cherché et cherché).Commande (ou script) similaire à git status pour montrer tous les commits locaux depuis le dernier git svn dcommit?

Merci pour l'aide.

 
#!/usr/bin/env python                    
import sys 
import subprocess 

s = subprocess.Popen("git svn log --show-commit --oneline".split(" "), 
        stdout=subprocess.PIPE) 

# Grab the last svn commit's data                 
revision, sha, message = s.stdout.readlines().pop(0).split(" | ") 

# Grab display of commits since svn rebase              
s = subprocess.Popen(("git log %s..HEAD --oneline" % sha).split(" "), 
        stdout=subprocess.PIPE) 
log = s.stdout.read().strip() 

if len(log.splitlines()) > 0: 
    print ("%d commits ahead of svn. To push them to svn, use 'git svn dcommit'.\n" 
       % len(log.splitlines())) 
    print log 
else: 
    print "No local commits that need 'git svn dcommit'" 
sys.exit(0) 

Répondre

3

Tout d'abord, faire une git branch -a à la liste de toutes les branches à distance:

$ git branch -a 
    git-svn 

Pour moi, seule la branche git-svn est cotée, mais vous pouvez avoir des noms différents en fonction des options que vous avez passé à git svn clone . Ensuite, utilisez

git log git-svn.. 

(en remplaçant votre nom approprié pour git-svn). La commande ci-dessus (notez les deux points de fin ..) montre tous les commits sur la branche actuelle depuis l'ancêtre commun le plus proche de la branche actuelle et la branche git-svn.

+0

Cette commande ne fonctionne pas pour moi, les rapports git ambiguïtés fatales. J'ai essayé "git log - git - svn .." et "git log - git - svn..HEAD" et ni l 'affichage des commits appropriés. La commutation de l'ordre de "-" et "git-svn .." ne change pas non plus. – daffywolf

+0

@nicholas: cette commande fonctionne pour moi, je ne suis pas sûr du genre de "giga ambiguïté fatale" que git pourrait rapporter pour vous. Si vous faites une branche 'git -a', combien de fois' git-svn' est-il listé? –

+0

Voir ma réponse à ma propre question. Je n'ai pas de branche git-svn, j'ai plutôt une télécommande/trunk. Je ne sais pas pourquoi nos configurations diffèrent ... J'ai utilisé la disposition standard lors du clonage. – daffywolf

3

Après avoir joué avec la suggestion de Greg, je me suis retrouvé avec ceci:

git log remotes/trunk.. --oneline 

que je vais soit alias ou enveloppez dans un petit script.

La raison pour laquelle cela fonctionne et sa suggestion n'est pas que ma branche svn remopte est remotes/trunk pas git-svn. Je ne sais pas si c'est standard ou pas, d'autant plus que Greg a supposé git-svn.

+0

J'ai mis à jour ma réponse avec plus d'informations sur les noms de branches de suivi à distance git-svn. –

+0

Cette réponse fonctionne à ce jour. – bmargulies

0

Nice. Sur la base des informations ici, j'utilise:

git config alias.svn-status \!"git log git-svn.. --oneline |wc|perl -ne 'tr/ //s;s/^ //;(\$commits)=split(/ /,\$_,2);print \"Your branch is ahead of git-svn by \$commits commits\n\"'"

Cela suppose la norme par défaut git-svn nomenclature des prises en pension à distance.

0

j'ai ajouté à mon fichier ~/.gitconfig:

svn-status = !"git log `git svn log --show-commit --oneline --limit=1 | awk '{print $3}'`..HEAD --oneline" 

qui donne des messages courts pratiques s'il y a des changements qui ont besoin dcommit, et montre rien si vous êtes à jour (en supposant que vous » J'ai fait un rebase ou aller chercher). vous pouvez modifier les paramètres du git-log externe si vous le souhaitez également.

+0

Answer http://stackoverflow.com/a/2097935/2596664 est plus simple et fait exactement la même chose. –

0

L'un des (ils sont synonymes):

git svn dcommit --dry-run 
git svn dcommit -n