在Git Pull时运行Pip install -r requirements.txt?

6

我目前正在使用pip进行Python的软件包管理,但是我的团队中有些人在重新运行我们的代码库时会忘记重新运行pip install -r requirements.txt,然后会对为什么程序不能正常运行感到困惑。因此,是否有任何方法可以将该命令与他们必须执行的其他操作(如git pull)绑定在一起,以便为他们完成该操作,而不需要考虑它?


我会研究一下 fabric - jterrace
一种脚本解决方案可能适用于您自己,以及那些可以意识到如果/当他们不想考虑自己在做什么时应该使用脚本解决方案的人;但是教育/引导人们思考自己在做什么并不是脚本解决方案能够做到的。 - ThorSummoner
3个回答

4
您可以在git的 post-merge hook中使用shell脚本,每当合并发生时就会执行。请注意,此钩子将在每次合并时执行(所有实际执行操作的拉取都是合并,但并非所有合并都是拉取)。
我不知道是否可能在克隆存储库时自动安装客户端钩子,但您应该至少能够安装您的post-merge钩子一次,而不是让团队记住每次拉取时都要做些什么。

如果您想分发一个包含此类钩子的仓库,您可以清理您的.git/config和其他git元数据,以确保您没有分发其他限制;然后将整个git仓库或只关键的.git部分打包成tar/zip文件,并让人们从中复制、提取和工作。尽管我仍然希望首先教育您的用户,将这种极端措施保留给绝望的情况。 - ThorSummoner

4
一个 post-merge 钩子应该可以在这里正常工作。在您的项目的 .git 目录中打开文件 .git/hooks/post-merge。将以下代码片段粘贴到文件中。
#!/usr/bin/env bash
changed_files="$(git diff-tree -r --name-only --no-commit-id ORIG_HEAD HEAD)"

check_and_run() {
       echo "$changed_files" | grep --quiet "$1" && eval "$2"
}
        
check_and_run requirements.txt  "/path/to/virtualenv/bin/pip install -r /path/to/requirements.txt"

运行chmod +x post-merge以使文件可执行。

就这样。现在,每当您执行git合并并且requirements.txt文件中有更改时,pip install将自动运行。


1
如果您有能力将工具添加到所有用户的路径中,例如您们都在单个服务器上工作。创建一个脚本来完成这个任务是非常简单的。
基本上就是:
#!/usr/bin/env bash
# Save as `git-pull2`
# Mark as executable (chmod +x git-pull2)
# Include on system path.

git pull $@
pip install -r requirements.txt
< p > @$ 将所有命令参数传递给脚本化的 git pull,虽然我不能保证这在所有情况下都能百分之百地工作,但它应该涵盖大多数用例。

你可以随意命名它,我没有测试过用脚本替换 git 内部命令,例如我不建议将其命名为 git-pull,因为那可能会与真正的 git-pull 冲突并进入循环,但 git 也可能足够聪明,不会递归执行。

当 git 扩展自定义命令时,在 git 关键字后的第一个连字符会被删除,例如要运行 git-pull2,您可以将其直接运行为 git-pull2 或作为嵌入式 git 命令运行,如 git pull2


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接