python-3.x - 识别 git 提交的实际分支名称
问题描述
这是一个简单的 git 存储库。我已经用数字标记了提交,以便于参考。回购有以下分支:
- 主:13 次提交 (1,2,3,4,5,6,7,8,9,10,11,12,13)
- new_branch:8 次提交 (1,2,3,4,5,6,14,15)
- test_branch:3 次提交 (1,2,3)
- yet_another_branch: 14 次提交 (1,2,3,4,5,6,7,8,9,10,11,12,16,17)
提交 5,6 属于拉取请求,因此带有 5,6 的蓝色部分不是分支。
请注意,提交 1,2 被视为所有分支的一部分,但我想将所有黑色提交视为主分支的一部分。同样,对于“测试分支”,我只想将提交 3 视为分支的一部分。
from git import Repo
git_url = "https://github.com/unimamun/test-repo.git"
repo_dir = "/mnt/hdd/aam/J2_Repos/test-repo/test-repo"
repo = Repo.clone_from(git_url, repo_dir)
# get all commits by branches
def get_commits(repo, ref_name):
commits = []
for commit in repo.iter_commits(rev=ref_name):
commits.append(commit)
return commits
print('\nCommits in Branches:')
for ref in repo.references:
print(ref.name,': ', str(len(get_commits(repo, ref.name))))
print('\nCommits in master:')
commits = list(repo.iter_commits('master'))
commits.reverse()
i = 0
for commit in commits:
i += 1
print(i,': ', commit.hexsha)
# to see parents of the commit
#print('Parents: ',commit.parents)
从上面的代码,我有以下输出:
Commits in Branches:
master : 13
origin/HEAD : 13
origin/master : 13
origin/new_branch : 8
origin/test-branch : 3
origin/yet_another_branch : 14
Commits in master:
1 : 694df9fee2f9c03a33979725e76a484bce1738a0
2 : c0fe1b76131b7fcb103f171fd93d85cda17b756c
3 : 0199ad335f65d52a2895a678a19e209e1e16a1a7
4 : dd0903259b0aadbf2d8fb00e566eee014264f7c0
5 : 7ed55c51e2527f47bc6344cd960ff5beb90cc65d
6 : d10f19c85fbc1c27b7719a2dc64989255697181d
7 : c41bdfaeae1f801776420ce161ca2555dffc5aad
8 : 56b5d6e1831a477c79e0fd336acc96ca266d5dea
9 : 6305a72d4e257ebe74b10ca538906f1eceb091bf
10 : 4c5d1ebe5f2f8168ee8bf4a969855821d04caf09
11 : 362bc52be00af3fb917196cf27a8ddc0bb8fd4ba
12 : 5a70a46394eb08b4b48f9eb05798048ca7269a9d
13 : f4a8bdd318b2678191d06616a55df26416a28363
我想要以下输出。以便为图中的每个黑点打印“master”,并为非黑色提交打印其他分支名称(在这种情况下,对于绿色提交 3,应打印 test-branch)
Commits in master:
1 : 694df9fee2f9c03a33979725e76a484bce1738a0 master
2 : c0fe1b76131b7fcb103f171fd93d85cda17b756c master
3 : 0199ad335f65d52a2895a678a19e209e1e16a1a7 test-branch
4 : dd0903259b0aadbf2d8fb00e566eee014264f7c0 master
5 : 7ed55c51e2527f47bc6344cd960ff5beb90cc65d master
6 : d10f19c85fbc1c27b7719a2dc64989255697181d master
7 : c41bdfaeae1f801776420ce161ca2555dffc5aad master
8 : 56b5d6e1831a477c79e0fd336acc96ca266d5dea master
9 : 6305a72d4e257ebe74b10ca538906f1eceb091bf master
10 : 4c5d1ebe5f2f8168ee8bf4a969855821d04caf09 master
11 : 362bc52be00af3fb917196cf27a8ddc0bb8fd4ba master
12 : 5a70a46394eb08b4b48f9eb05798048ca7269a9d master
13 : f4a8bdd318b2678191d06616a55df26416a28363 master
我需要从提交 1 迭代到 13,并且在此过程中我需要确定哪个提交属于哪个分支。非常感谢。
解决方案
您可能想尝试“ --first-parent
”选项:
git log --oneline --first-parent master
从数学上讲,这是一个图,它使得在合并点,没有一个分支应该比另一个分支“更重要”。但事实上,问题总是会出现,并且在执行“合并”操作时,实际上会将外部分支“带入”当前分支。因此,这个当前分支被声明为提交对象内的第一个分支。
如果您在诸如 linux 内核之类的大型项目的主分支上尝试此操作,您将主要落在合并点上,分支上只有几个直接变更集。
如果这正是您想知道的,您可以另外指定“ --no-merges
”以明确排除合并点。
git --oneline --first-parent --no-merges master
例如,这将从您的图表中排除点4和7 。
最后,要将搜索限制为仅属于特定分支且不从主分支继承的提交,请使用“ ..
”运算符:
git log master..yourbranch
... 只会显示可从“yourbranch”访问但不能从“master”访问的提交。
推荐阅读
- dialogflow-es - 如果粒子“不”,Dialogflow 无法识别正确的意图
- angular - 角度 6 防护 可观察悬挂
- rpm - RPM Build - 从安装机器获取用户
- maven - 为 Spring Boot 应用程序基于“openjdk:8-jdk-alpine”构建 docker 映像时无法运行“./mvnw clean install”
- java - 我需要模拟函数,但它不起作用,如何在不修改 src 代码的情况下构建单元测试?
- xamarin - 在 Xamarin 中刷新 JWT 令牌的最佳实践
- python-3.x - 删除python中的url/@等
- database - React:创建不同的用户配置文件
- windows - 在 windows cmd 中的一行上写两个命令时,有没有办法分隔变量名?
- python-3.x - 使用 Python 请求抓取 ajax 网站