如何使用代码中的系统调用在 git 中的根提交上执行 git 命令?



我希望能够在 git 存储库中处理根提交的 SHA

问题是我正在使用脚本来自动化某个 git 任务,我需要在各种存储库上多次执行该任务。

我正在使用函数system(),C 的标准库函数进行系统调用,大多数语言都有等效项。

以下过程不适用于system()

  1. 使用system("<git command for listing SHAs here>")
  2. 查找根提交
  3. 运行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,请注意outputbytes而不是str组成。 然后,您可以将输出解析为一系列行,以查找根提交。 如果有多个根,则由您决定如何处理。

由于git rev-list是一个管道命令,因此其输出通常设计为机器可读。

system("git rebase <SHA of root commit>")

重新构建复杂的历史很少是明智的,但如果您有一个简单的历史,这可能很好。 拥有简单的历史记录也可以保证您的单个根提交:明智的做法是验证(例如,使用git rev-list --parents的输出(您确实有一个简单的历史记录。

最新更新