import git repo = git.Repo(repo_dir) ref_name = 'master' for commit in repo.iter_commits(rev=ref_name): <some code here> This code iterates through all the commits. I want to iterate b/w 2 commits. Just like git log commit1...commit2How can I do the same using GitPython's iter_commits() method.
4 Réponses :
Tout d'abord, créez une fonction pour exécuter la commande git
.
log = (execute_gitcmd(gitcmd, your_repository))
Ensuite, écrivez n'importe quelle commande git
comme vous l'utilisez sur le terminal, par exemple:
gitcmd = "git log -n1 --oneline"
Enfin, appelez votre fonction:
from git import * from subprocess import Popen, PIPE def execute_gitcmd(cmd, repo): pipe = subprocess.Popen(cmd, shell=True, cwd=repo, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, error) = pipe.communicate() return out, error pipe.wait()
J'espère que cela peut vous aider.
p>
1. La question concernait GitPython. 2. La fonction a un bug majeur - return
avant pipe.wait ()
.
Je vous suggère d'utiliser PyDriller (un wrapper autour de GitPython, pour faciliter les choses). Ce que vous avez demandé peut être fait comme ceci:
for commit in RepositoryMining("path_to_repo", from_commit="first", to_commit="second").traverse_commits(): # your code
Vous pouvez utiliser gitpython pur pour cela.
Si vous voulez pouvoir parcourir certains commit (en supposant le premier
commit est HEAD), utilisez simplement max_count
. Voir L'objet Commit
from pprint import pprint as pp >>> pp(logs) ('f63d26b Fix urxvt name to match debian repo\n' '571f449 Add more key for helm-org-rifle\n' 'bea2697 Drop bm package')
si vous voulez une capacité similaire à git log commit1 ... commit2
comme vous l'avez mentionné:
>>> logs 'f63d26b Fix urxvt name to match debian repo\n571f449 Add more key for helm-org-rifle\nbea2697 Drop bm package'
donnera vous:
logs = repo.git.log("--oneline", "f5035ce..f63d26b")
Vous pouvez également utiliser logs = repo.git.log ("f5035ce..f63d26b")
mais cela vous donnera toutes les informations (tout comme vous utilisez git log
sans --oneline
)
si vous voulez une belle sortie, utilisez une jolie impression:
two_commits = list(repo.iter_commits('master', max_count=2)) assert len(two_commits) == 2
Pour plus d'explications sur repo.git.log
, voir https: // stackoverflow.com/a/55545500/6000005
repo.iter_commits (rev = '1234abc..5678def')
fonctionne pour moi dans GitPython==2.1.11
Exemple:
< pré> XXX
Mais connaissez-vous le code pour exécuter la commande
git
sur le terminal? Si oui, vous pouvez créer une fonction à l'aide dusous-processus
. Ensuite, vous pouvez appeler la fonction pour exécuter la commandegit
.Oui, je peux faire ça. Mais je ne veux pas aller par là. Je veux utiliser cette lib GitPython
gitpython.readthedocs.io/en/stable/ … . De
Commit.iter_items ()
accepte un spécificateur de révision, pour lequel je pense que la plage de révision en fait également partie. Il suffit de passer'commit1 ... commit2'
pour faire le travail.Si votre question porte exclusivement sur "comment faire le truc X en gitpython", la balise gitpython est appropriée, mais aucune des autres balises ne convient car vous obtiendrez des réponses comme celle de @Yusufsn. Notez que commit concerne les transactions de base de données, pas les commits Git.