【问题标题】:cloning git repo from python从 python 克隆 git repo
【发布时间】:2022-11-02 05:36:49
【问题描述】:

src = user/my.git dest = /home/git_name ver = 1.1

def run
   p = subprocess.run(cmd, stdout=PIPE, stderr=PIPE)

我用以下 cmds 调用这个运行

1.  self.run(['mkdir', '-p', dest])
2.  self.run(['git', 'clone', '--no-checkout',src, dest])
3.  self.run(['cd', dest, ';', 'git', 'checkout', '--detach', ver]])

输出: 第一次运行是成功的
第二次运行克隆得到错误 stderr=b"Cloning into ' /home/git_name'...\n
第三次运行成功。

这个目录 /home/git_name.OLD.1723430 被创建,我在这个目录中看到一个 .git 。 我还有一个指向 src 的文件 /home/git_name,基本上有一个指向 src 目录的链接。

这两个都应该发生在同一个目录中,我不知道为什么两者都有两个和部分结果。 我不确定出了什么问题

还, src = user/my.git/repos/tags/1.1 是标签的实际位置 当我尝试使用整个路径时 git clone 说路径不正确

为什么会这样?

【问题讨论】:

  • 请注意subprocess.runshell=False 作为默认值,这意味着您不能将cd <path>; <cmd> 放入并期望它工作。有两种明显的方法来处理这个问题:使用 cwd= 可选参数subprocess.run 这样就不需要cd <path>,完全用Python解决这个问题;或使用git -C <path>,通过您运行的 Git 命令的参数来解决此问题。
  • 你当然可以添加shell=True,但是see xkcd

标签: python git subprocess


【解决方案1】:

第二次运行克隆得到错误 stderr=b"Cloning into ' /home/git_name'...

这不是错误,只是人类可读的输出是often redirected to stderr

注意:/home 用于用户帐户。您通常会克隆一个存储库里面/home/me,不是直接在/home

【讨论】:

    【解决方案2】:

    我最终这样做是为了让它工作

    a = subprocess.Popen(['git', 'clone', '--no-checkout', self.src, self.destination],  stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0]
    b =subprocess.Popen(['git', 'checkout', '--detach', self.ver], stdout=subprocess.PIPE, stderr=subprocess.PIPE, cwd= self.destination).communicate()[0]
    

    使用 shell = False(这是默认值) & 并将 cwd 添加到参数列表中以在目录中进行此切换以使 git 工作

    感谢所有帮助过的人!

    【讨论】:

      猜你喜欢
      • 2014-09-03
      • 2013-08-07
      • 1970-01-01
      • 2021-07-16
      • 2020-04-25
      • 1970-01-01
      • 2021-04-11
      相关资源
      最近更新 更多