Python 如何使用代码中的系统调用在git中的根提交上执行git命令?
我希望能够在git存储库中提交根目录的SHA 问题是,我正在使用一个脚本来自动化某个git任务,我需要在各种存储库中多次执行该任务 我正在使用函数Python 如何使用代码中的系统调用在git中的根提交上执行git命令?,python,git,Python,Git,我希望能够在git存储库中提交根目录的SHA 问题是,我正在使用一个脚本来自动化某个git任务,我需要在各种存储库中多次执行该任务 我正在使用函数system(),这是C的标准库函数,用于进行系统调用,大多数语言都有相应的函数 以下过程不适用于系统(): 首先使用系统(“”获取所有提交的SHA,注意不一定有一个根提交:给定N≥ 1提交至少有一个根,但可以有多个 也就是说,每个提交都有一个到其父级的向后链接,除非它是根提交,根据定义,根提交没有父级。因此,给定任何提交散列,您可以通过向后遍历图来找
system()
,这是C的标准库函数,用于进行系统调用,大多数语言都有相应的函数
以下过程不适用于系统()
:
系统(“”
获取所有提交的SHA,注意不一定有一个根提交:给定N≥ 1提交至少有一个根,但可以有多个
也就是说,每个提交都有一个到其父级的向后链接,除非它是根提交,根据定义,根提交没有父级。因此,给定任何提交散列,您可以通过向后遍历图来找到它的根。如果从所有可到达的提交开始并遍历所有路径,则将找到所有根提交
有一个Git命令正是这样做的:Git rev list
。您给它一些起始点提交说明符集,它将遍历图形。默认情况下,它会在遇到提交哈希ID时发出每个提交哈希ID,但它会使用许多选项,包括限制其输出的选项。例如,它有--min parents
和--max parents
选项,这些选项告诉它只发出至少有min,最多有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
由字节组成,而不是str
),然后可以将输出解析为一系列行,以查找根提交。如果有多个根,则由您决定如何处理
由于git rev list
是一个管道命令,其输出通常设计为机器可读
system(“git-rebase”)
重新设置复杂历史的基础是不明智的,但如果您有一个简单的历史,这可能很好。有一个简单的历史记录也可以保证您有一个单一的根提交:明智的做法是验证(例如,使用git rev list--parents
的输出)您确实有一个简单的历史记录。感谢您深思熟虑和透彻的回答。我对系统调用和git都是一个完全的初学者,你的答案很容易理解。
proc = subprocess.Popen(['git', 'rev-list', '--all', '--max-parents=0'],
stdout=subprocess.PIPE)
output = proc.stdout.read()
result = proc.wait()