我有一个带有两个存储库的git设置,这两个存储库都是可读/写的(我通常在一个代码上编码,但有时我也在另一个代码上编写代码)。我的工作流程通常是我在我的本地仓库上工作,然后当我准备好测试我的更改时,我将我的提交推送到我实际构建项目的另一个远程仓库。但是,出于某种原因,当我从本地推送到远程时,远程存储库上的更改将被反转,即更新存储库,但更改的反转(即将带来更改的更改)远程回购回到其预推状态)已在索引中注册。
例如,假设我有一个评论// This is a comment
的文件,我已在本地更新为// This is a comment that has been updated
,然后将其推送到我的远程仓库,我的遥控器上显示以下内容回购:
remote_repo$ git diff --cached
-// This is a comment that has been updated
+// This is a comment
显然我可以通过运行git reset --hard
将它们带入相同的状态,但有没有其他方法可以做到这一点和/或自动化它?我希望大多数人会建议添加一个运行git reset --hard
的post-receive挂钩,但我希望这可以通过干净的方式进行配置。
答案 0 :(得分:2)
据推测,您正在推动目前在另一个回购中检出的分支。
适用的配置选项为receive.denyCurrentBranch
。它的最初目的(我相信当前的默认值......所以,如果你之前没有遇到过此选项,我会感到惊讶)是为了避免索引的反向变化" 34;通过简单地拒绝更新当前头部的推动情况。
只要您将工作树保留在"其他"回收清洁,没有理由你没有你的蛋糕和吃它。如果您将receive.denyCurrentBranch
设置为updateInstead
,那么git将继续更新头部,然后执行结帐以同步索引和工作树 - 只要他们进行清理即可。< / p>
如果你想生活危险,你可以使用push-to-checkout
钩子来配置甚至限制。
更新 - 没有考虑这个角度,因为在问题中没有提到链接的工作树,但是torek指出:如果你使用链接的工作树(即git worktree add
)在收到推送的repo中,receive.denyCurrentBranch
设置不会保护已检出链接工作树的分支;只有主工作树受到保护。如果需要,我想你可以编写一个post-receive钩子来模仿updateInstead
对链接树的行为。