我希望能够在 git 存储库中处理根提交的 SHA
问题是我正在使用脚本来自动化某个 git 任务,我需要在各种存储库上多次执行该任务。
我正在使用函数system()
,C 的标准库函数进行系统调用,大多数语言都有等效项。
以下过程不适用于system()
:
-
使用
system("<git command for listing SHAs here>")
- 查找根提交
-
运行
system("<git command here> <SHA of root commit>")
我正在寻找的命令可能如下所示:
system("git checkout root");
如果是这种情况,命令是什么?如果不是这种情况,适当的解决方案是什么?有没有更好的替代方案不使用system()
(在 C 中执行命令的函数(?
首先,请注意不一定有一个根提交:给定 N 个≥ 1 个提交,至少有一个根,但可能有多个根。
也就是说,每个提交都有一个指向其父级的向后链接,除非它是根提交,根据定义,根提交没有父级。 因此,给定任何提交哈希,您可以通过向后移动图形来找到其根。 如果您从所有可访问的提交开始并遍历所有路径,您将找到所有根提交。
有一个 Git 命令正是这样做的:git rev-list
. 你给它一些起点提交说明符,它会遍历图形。 默认情况下,它会在遇到每个提交哈希 ID 时发出它,但它需要许多选项,包括限制其输出的选项。 例如,它具有--min-parents
和--max-parents
选项,告诉它仅发出至少具有最小值和最多最大值的父项的提交。 因此:
git rev-list --all --max-parents=0
发出所有根提交,如从所有引用 (--all
( 中找到的那样。
[
git rev-list
] 将文本输出到命令行,而不是将列表数据结构返回到代码
它将文本输出到标准输出。 任何合理的编程语言和操作系统都提供了一种捕获该输出的方法:
proc = subprocess.Popen(['git', 'rev-list', '--all', '--max-parents=0'],
stdout=subprocess.PIPE)
output = proc.stdout.read()
result = proc.wait()
例如。 (如果使用 Python 3,请注意output
由bytes
而不是str
组成。 然后,您可以将输出解析为一系列行,以查找根提交。 如果有多个根,则由您决定如何处理。
由于git rev-list
是一个管道命令,因此其输出通常设计为机器可读。
system("git rebase <SHA of root commit>")
重新构建复杂的历史很少是明智的,但如果您有一个简单的历史,这可能很好。 拥有简单的历史记录也可以保证您的单个根提交:明智的做法是验证(例如,使用git rev-list --parents
的输出(您确实有一个简单的历史记录。