Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用代码中的系统调用在git中的根提交上执行git命令?_Python_Git - Fatal编程技术网

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

Python 如何使用代码中的系统调用在git中的根提交上执行git命令?,python,git,Python,Git,我希望能够在git存储库中提交根目录的SHA 问题是,我正在使用一个脚本来自动化某个git任务,我需要在各种存储库中多次执行该任务 我正在使用函数system(),这是C的标准库函数,用于进行系统调用,大多数语言都有相应的函数 以下过程不适用于系统(): 首先使用系统(“”获取所有提交的SHA,注意不一定有一个根提交:给定N≥ 1提交至少有一个根,但可以有多个 也就是说,每个提交都有一个到其父级的向后链接,除非它是根提交,根据定义,根提交没有父级。因此,给定任何提交散列,您可以通过向后遍历图来找

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

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

我正在使用函数
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()