GitPython获取起始sha1和结束sha1之间范围内的所有提交



我正在使用GitPython库,想知道如何在两个提交sha-1的分支上获得所有提交。我有起点和终点。有没有办法得到他们的名单?

我已经实例化了repo对象,想知道是否有一种方法可以查询它并获得两个sha范围内的提交列表?

会想做一些类似于这个命令的事情,但将它们作为列表返回:

git log e0d8a4c3fec7ef2c352342c2ffada21fa07c1dc..63af686e626e0a5cbb0508367983765154e188ce --pretty=format:%h,%an,%s > commits.csv

似乎有Repo.iter_commits((方法,但看不到如何指定范围。

@shlomi33这是我的解决方案:

这是我用来设置GitPyhton提交对象列表的方法。在类中,我已经实例化了这个方法所依赖的Repo对象

Edit:还添加了用于设置Repo对象实例的init方法。

def __init__(self, repo_url, project_name, branch_name) -> None:
"""
Clone the required repo in the repo folder and instantiate the Repo instance
:param repo_url: str of the git repository url
:param project_name: str of the project name
:param branch_name: str of the branch name
"""
self._repo_url = repo_url
self._project = project_name
self._branch = branch_name
self._project_dir = Path(self._repo_dir, self._project)
if self._project_dir.exists():
self._logger.info('Deleting existing repo: ' + str(self._project_dir))
shutil.rmtree(self._project_dir)
self._logger.info('Creating directory for repo: ' + str(self._project_dir))
os.makedirs(self._project_dir)
try:
self.repo = GitRepo.clone_from(self._repo_url, self._project_dir, branch=self._branch,
progress=self.__progress)
except GitCommandError:
self._logger.error('Failed to clone repo. Make sure you have git ssh access set up.')
raise
self._logger.info('Repository downloaded to: ' + str(self._repo_dir))
def set_commits(self, start_rev: str, end_rev: str):
"""
Sets a list of Commits for the range of the start rev and end rev
:param start_rev: Start commit revision SHA1
:param end_rev: End commit revision
"""
self._start_rev = start_rev
self._end_rev = end_rev
commits = self.repo.iter_commits(start_rev + '..' + end_rev)
self._commits = list(map(Commit, list(commits)))

repo.iter_commits("revA..revB")

@rtn的答案有解决方案,但有点隐蔽。下面是一个简单易懂的例子。

from git import Repo
repo = Repo("/path/to/your/repo")
start_rev, end_rev = "HEAD~2", "HEAD"  # Or any other valid ref
commits = repo.iter_commits(f"{start_rev}..{end_rev}")
for commit in commits:
# Do your thing...

start_revend_rev可以是git提交散列、分支名称或标记名称,即git log A..B支持的任何名称


来自Repo.iter_commits:的文档

要只接收两个命名修订之间的提交,请使用"revA…revB"修订说明符

不是一个高效或优雅的解决方案,但很短:

迭代分支HEAD的提交,直到达到特定的提交。

other_commit = repo.commit(commit_sha)
commits = []
for commit in repo.iter_commits():
if commit == other_commit:
break
commits.append(commit)

这对我的用例来说很好。

最新更新