3
votes

Iterate commits b / w 2 commits spécifiés dans GitPython

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 commentaires

Mais connaissez-vous le code pour exécuter la commande git sur le terminal? Si oui, vous pouvez créer une fonction à l'aide du sous-processus . Ensuite, vous pouvez appeler la fonction pour exécuter la commande git .


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.


4 Réponses :


-1
votes

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 commentaires

1. La question concernait GitPython. 2. La fonction a un bug majeur - return avant pipe.wait () .



1
votes

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


0 commentaires

2
votes

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


0 commentaires

2
votes

repo.iter_commits (rev = '1234abc..5678def') fonctionne pour moi dans GitPython==2.1.11

Exemple:

< pré> XXX


0 commentaires