我现在通过 pip 进行 Python 包管理,但我团队中的人在重新运行我们的代码库时总是忘记重做 pip install -r requirements.txt,然后对为什么这些东西不起作用感到困惑。就是说,有什么方法可以将这个命令与他们无论如何都必须做的其他事情联系起来,比如git pull
这样它就为他们完成了,他们不需要考虑它?
3 回答
您可以在 git post-merge hook中使用 shell 脚本,只要发生合并,就会执行该脚本。请注意,此钩子将在每次合并时执行(所有实际执行某些操作的拉取都是合并,但并非所有合并都是拉取)。
我不知道是否可以在克隆存储库时自动安装客户端挂钩,但是您至少应该能够安装一次合并后挂钩,而不是让您的团队记住每次拉动都做某事.
post-merge
钩子在这里应该可以正常工作。打开.git/hooks/post-merge
项目.git
目录中的文件。将以下代码段粘贴到文件中。
#/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 merge 并且requirements.txt
文件发生更改时pip install
都会自动运行。
如果您有能力将工具添加到所有用户的路径中;例如,你们都在一台服务器上工作。创建一个脚本来做到这一点将是微不足道的。
本质上它会是
#!/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
@$
会将所有命令参数传递给 scripted ,git pull
尽管我不能保证它会一直工作 100%,但它应该涵盖大多数用例。
你可以随意命名它,我没有测试过用脚本命令替换 git 内部命令,例如我不建议命名它git-pull
,因为这可能与真正的 git-pull 冲突并进入循环循环,但 git 也可能是足够聪明,不会那样递归。
当 git 扩展自定义命令时,git
删除关键字后的第一个连字符,例如要运行,git-pull2
您可以按字面意思运行它,也可以git-pull2
作为嵌入式 git 命令运行git pull2
。