2017-09-22 197 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