【问题标题】:Pip install -r requirements.txt on Git Pull?在 Git Pull 上 Pip install -r requirements.txt?
【发布时间】:2012-10-01 07:36:33
【问题描述】:

我现在通过 pip 进行 Python 包管理,但我的团队中的一些人在重新运行我们的代码库时总是忘记重做 pip install -r requirements.txt,然后对为什么东西不这样做感到困惑工作。也就是说,有没有什么办法可以将该命令与他们无论如何都必须做的其他事情联系起来,比如git pull,这样他们就可以完成并且他们不需要考虑它?

【问题讨论】:

  • 我会调查fabric
  • 脚本化解决方案可能适合您自己,也可能适合那些可以意识到如果/当他们不想考虑自己在做什么时应该使用脚本解决方案的人;但是教/唤起人们思考他们在做什么并不是脚本化解决方案可以做到的。

标签: python git pip


【解决方案1】:

您可以在 git post-merge hook 中使用 shell 脚本,该脚本将在发生合并时执行。请注意,这个钩子将在每次合并时执行(所有实际做某事的拉取都是合并,但并非所有合并都是拉取)。

我不知道是否可以在克隆存储库时自动安装客户端挂钩,但您至少应该能够安装一次合并后挂钩,而不是让您的团队记住做某事每次拉动。

【讨论】:

  • 如果你想分发一个嵌入了这样一个钩子的 repo,你可以清理你的 .git/config 和其他 git 元数据,以确保你没有分发其他限制;然后打包整个 git repo,或者只是作为 tar/zip 重要的 .git 部分,并让人们从中复制-提取-工作。虽然我仍然想推动首先教育你的用户,为绝望的情况保留如此激烈的东西。
【解决方案2】:

post-merge 钩子在这里应该可以正常工作。在项目的.git 目录中打开文件.git/hooks/post-merge。将以下代码 sn -p 粘贴到文件中。

#/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 都会自动运行。

【讨论】:

    【解决方案3】:

    如果您有权将工具添加到所有用户的路径中;例如,你们都在一台服务器上工作。创建一个脚本来做到这一点很简单。

    基本上是这样

    #!/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
    

    @$ 会将所有命令参数传递给脚本化的git pull,尽管我不能保证它会一直 100% 工作,但它应该涵盖大多数用例。

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

    当 git 扩展自定义命令时,删除 git 关键字后的第一个连字符,例如运行 git-pull2,您可以按字面意思运行它 git-pull2 或作为嵌入式 git 命令运行 git pull2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2018-12-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多