在"更新"git 钩子中,我正在尝试 cd 到存储库的克隆,运行 git fetch
,并git checkout
新提交。但我认为提交还不存在。有什么办法可以做到这一点吗?我尝试做git archive [sha]
但考虑到这个钩子在我们公司运行的频率,这需要很长时间。
我应该签出更新的基本引用,然后应用生成的补丁或其他东西吗?
我最终得到了这样的东西:
git diff [OLD-COMMIT] [NEW-COMMIT] > /tmp/update.patch
cd /path/to/the/existing/clone
git fetch origin
git reset --hard [OLD-COMMIT]
git apply /tmp/update.patch
# Run tests
效果很好。
对于您的用例,我唯一能想到的就是拥有 2 个 git 存储库。工作流程会像这样。
git commit
git push ServerA
# post-receive checks out commit and runs unit tests
# ERROR: message returned
# fix your code
git commit
git push ServerA
# post-receive checks out commit and runs unit tests
# SUCCESS: pushes to ServerB
由于您想引用提交(需要post-receive
(并能够拒绝提交(需要pre-receive
(,不知道是否有更好的方法。 我会说正常的工作流程是在本地运行一些测试,然后推送到存储库以运行完整的测试。 如果失败,请推送一个固定提交,然后当您将所有内容合并到开发/主分支中时,您可以重新设置所有额外提交的基础。