【问题标题】:Trying to clone a list of GitLab Repo's with subprocess module尝试使用 subprocess 模块克隆 GitLab Repo 的列表
【发布时间】:2022-07-08 17:02:32
【问题描述】:

我正在尝试从我的 GitLab 服务器克隆大量 GitLab 存储库。但是,我无法让子流程模块工作。我已经尝试过这个问题的答案,但它对我不起作用。 Open Git Bash shell using a python script and then run a shell script in git bash shell

这是我的代码:

repo_list = [list_with_all_repository_names]

    for repo_name in repo_list:
        repo_url = f'https://url_to_my_gitlab_server/{repo_name}.git'
        p = subprocess.run(["C:/Users/my_user_name/AppData/Local/Programs/Git/git-bash.exe",
                            "C:/Users/my_user_name/Documents/Gitlab Repos/git-clone-shell.sh",
                            f"git clone {repo_name}"],
                         bufsize=-1,
                         executable=None,
                         stdin=None,
                         stdout=None,
                         stderr=None,
                         preexec_fn=None,
                         close_fds=False,
                         shell=False,
                         cwd="C:/Users/my_user_name/Documents/Gitlab Repos")
        time.sleep(20)

我的 shell 脚本只是 subprocess.run 调用中 f"git clone {repo_name}" 参数的占位符,因此它的内容不超过 $1

Git bash 打开但立即崩溃,我不知道为什么。我也尝试在没有 shell 脚本的情况下直接在 bash 中运行命令,但这只是打开 git bash 并且什么都不做:

p = subprocess.run(
    [f'git clone {repo_url}'],
    bufsize=-1,
    executable='C:/Users/my_user_name/AppData/Local/Programs/Git/git-bash.exe',
    capture_output=True,
    cwd="C:/Users/my_user_name/Documents/Gitlab Repos"
)

我感觉我已经接近解决方案,但我不明白哪里出了问题。

【问题讨论】:

  • “立即崩溃”是什么意思?请注意,git-bash(实际上只是 bash,移植到 Windows;它与 Git 无关),使用参数运行,像这样,将尝试执行给定的脚本,$1 设置为文字字符串"git clone <name>" 包含空格。所以它应该运行 in 脚本中的命令,接下来是脚本中的内容(你还没有向我们展示)。但是 Windows 上的 msys 程序和非 msys 程序之间存在潜在的不良交互,所以也许这就是你的问题。
  • 我的意思是立即崩溃:我看到 git-bash 打开,但之后立即关闭。我知道像这样脚本将简单地使用设置为文字字符串的参数执行。这就是为什么我的 shell 脚本只不过是我想要实现的 'git clone name' 的占位符(1 美元,仅此而已)。我没有向你展示什么?什么是 Msys 程序?您对改进问题有什么建议吗?我仍然认为我的代码有问题,而不是潜在的不良交互
  • 我不使用 Windows,但我会阅读邮件列表上的内容。 :-) “msys 程序”是使用特定库在 Windows 上伪造 POSIX 样式环境的程序。这使人们能够做更多类似 Unix 的事情。一些 Git 发行版使用 msys2,而 bash 使用 msys2,当从另一个 msys2 程序运行一个 msys2 程序时,有一些特殊的魔法可以使它们更好地协调。你的 Python 是否使用 msys2,我不知道。我们缺少的是 shell 脚本中的内容(尽管现在您已经告诉我们这是一行、两行或其他内容)。
  • 编辑问题,以便解释我的 shell 脚本的内容
  • OK:我(在类 Unix 系统上)用import subprocess; v = subprocess.run(["/usr/local/bin/bash", "bar.bash", "echo testing"], bufsize=-1, stdin=None, stdout=None, stderr=None, shell=False); print(v) 创建了一个foo.py。将./bar.bash 创建为可执行文件,并将$1 作为其唯一的行在标准输出上给了我testing,所以这一切在类Unix 系统上都可以正常工作......(在testing 之后,我还从python3 得到CompletedProcess(...) )。

标签: python git shell subprocess


【解决方案1】:

我通过在 WSL 环境中运行脚本解决了这个问题,并使用以下子进程设置:

for repo_name in repo_list:
    repo_url = f'url_to_gitlab_server/{repo_name}.git'
    p = subprocess.run(["git", "clone", f"{repo_url}"],
                     bufsize=-1,
                     stdin=None,
                     stdout=None,
                     stderr=None,
                     shell=False)
    print(p)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多