2017-09-22 145 views
0

我有一个git设置与两个仓库,这两个都是读/写(我通常在一个代码,但有时我也在另一个代码)。我的工作流程通常是我在本地回购工作,然后当我准备好测试我的更改时,我将我的提交推送到其他远程回购,我实际上构建了我的项目。然而,出于某种原因,当我从本地到远程推送时,远程存储库上的更改是“倒置的”,即更新了存储库,但更改的反面(即将远程回购变回其更改的更改预先推送状态)在索引中注册。推送到远程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

注意:此时索引中的内容是在推送之前索引*中的内容。这就是问题的根源:索引与之前的HEAD提交匹配,但是HEAD本身已经发生了某种变化,现在已经解决了一个新的不同的提交。你不需要硬复位(混合复位就足够了),但总的来说,这有点陷阱。 – torek

+0

Doh,回想起来总是有道理。我意识到这是一个尴尬的工作流程,但我拥有两个仓库,任何人都不能访问,所以危险实际上只是一个不便。 – DIMMSum

回答

2

推测你正在推送到当前在其他回购中检出的分支。

适用的配置选项是receive.denyCurrentBranch。这是最初的目的(我相信目前的默认...所以我很惊讶,如果你以前没有遇到过这个选项)通过简单地拒绝将更新当前头部的推动来避免“索引中的反向变化”情况。

只要你保持“其他”回购清洁工作树,没有理由你不能吃你的蛋糕和吃它。如果你将receive.denyCurrentBranch设置为updateInstead,那么git会继续并更新头部,然后执行结帐以同步索引和工作树 - 只要它们干净地进入。

如果你想活得很危险,您可以使用push-to-checkout钩子甚至可以配置该限制。

UPDATE - 并没有考虑过这个角度,因为在这个问题并没有提及与工作的树木,但托雷克指出:如果你使用的链接工作树(即git worktree add)在回购接收推,receive.denyCurrentBranch设置将不会保护链接工作树检出的分支;只有主工作树被保护。如果需要的话,我想你可以写一个post-receive钩子来模仿链接树木的行为updateInstead

+0

还应该意识到push与'git worktree add'严重相互影响:https://stackoverflow.com/q/41158057/1256452 – torek