【发布时间】: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