[英]Git: making pushes to non-bare repositories safe
我可以使用git專家的一些指導來確保對非裸存儲庫的推送操作安全。 基本上我有一個關於如何做到這一點的計划,並且可以使用關於該計划是否合理的一些建議:)
通常,當您在git中推送到非裸存儲庫時,其工作副本和索引不會更新。 正如我所發現的,如果您忘記以后手動更新它們,這可能會導致嚴重的問題!
在我們的小組中,我們有一些“中心”存儲庫,人們克隆並推回,但許多人也希望能夠克隆他們的克隆,並按照真正的分布式方式在他們之間推/拉。 為了使這個安全,我想確保通過“clone”或“init”創建的每個存儲庫都有一個自動安裝的post-receive掛鈎,它將在推送操作后更新工作目錄和索引,以便與新HEAD。
我發現我可以通過在hooks子目錄中使用post-receive hook創建一個模板目錄來實現這一點,然后讓我的組中的每個人都執行:
git config --global init.templatedir /path/to/template/dir
目前我的post-receive掛鈎看起來像這樣:
export GIT_WORK_TREE=..
git checkout -f HEAD
這個SEEMS按照需要工作,但我對checkout命令有一些不確定性。 為了將工作目錄和索引與HEAD中的狀態同步,“git checkout -f HEAD”和“git reset --hard HEAD”是否相同?
我問,因為雖然我知道“git reset --hard HEAD”會做我想要的,但是在我的測試中使用它在后接收鈎子中大大減慢了推送操作(它似乎重新檢查了所有文件,無論工作目錄中的文件是臟還是干凈)。 “git checkout -f HEAD”SEEMS更快地做同樣的事情(給我一個干凈的工作目錄和索引與HEAD同步),但我有點緊張,因為checkout命令傾向於在飛行中做與未提交的工作目錄更改合並。 這個命令真的會給我一個工作目錄和索引,它在所有情況下都與HEAD中的狀態完全匹配(包括,例如,文件刪除,重命名等)?
提前感謝任何建議!
我可能誤解了這個問題。 你真的想要設置它,這樣任何人都可以推送到開發人員的工作目錄,而他正在進行未提交的更改嗎? 任何一段話都不能使其“安全”。
大多數人所做的是擁有他們正常的工作目錄,這是私有的,並將其完全克隆到同一磁盤上的公共倉庫中,然后共享該目錄。 這使用硬鏈接,所以你幾乎不使用任何額外的空間。 您將更改推送到同事的公開裸倉庫中,當他准備接收更改時,他會進入工作目錄。 或者,你把你變成你的公共裸露回購,和你的同事從那里拉當他准備好了。 推動非裸存儲庫很難建立的原因。
我建議使用Git FAQ條目指示post-update
掛鈎 “ 為什么我不會在”git push“之后看到遠程倉庫中的更改? ”。
在進行硬重置之前,它會隱藏分階段和未分階段的更改(跟蹤文件)。 它比普通的硬重置更安全,但正如FAQ條目所述,它仍然沒有涵蓋可能出現的所有情況(例如,具有預先存在的沖突的索引無法被隱藏;它不會自動合並更改未經修改的文件,如git checkout
等等)。
但是,......
如果可能的話......
你可能應該首先避免推送到任何檢出的分支。
只要您沒有推送到已檢出的分支,就可以推送到非裸存儲庫(畢竟,所涉及的配置變量是receive.denyCurrentBranch
,而不是“ receive.denyNonBare
”)。
上面鏈接的FAQ條目的最后一段鏈接到(如下面的評論中,Mark Longair提到的) 另一個條目 ,其中概述了推送到非裸存儲庫的方法。 該條目的動機是兩個非裸存儲庫之間的非對稱網絡連接,但該技術可以應用於您需要/想要推送到非裸存儲庫的任何情況。
后一個FAQ條目給出了推送到遠程跟蹤分支的示例(在refs/remotes/
)。 只有refs/heads/
下的refs/heads/
可以在沒有拆卸HEAD的情況下檢查出來(不使用git symoblic-ref
),所以推送到refs/heads/
之外的任何東西應該是安全的,以避免“推到檢出的分支”。
由於您在集中式環境中工作,因此您可以為此類推送的目標制定策略。 例如:
當您需要將提交推送到其他人的非裸存儲庫時,將它們推送到
refs/remotes/from/<your-username>/<branch>
。 為了避免與正常的遠程跟蹤分支沖突,任何人都不應該定義遠程命名from
。 像這樣推出的分支將顯示在git branch -a
(或-r
)中,因此可以在沒有refs/remotes/
前綴的情況下引用。 但是,from
偽遠程不會出現在git remote
因為沒有remote.from.url
配置變量。例:
alice$ remote add betty bettys-machine:path/to/some/non-bare/repository alice$ git push betty master:refs/remotes/from/alice/bug/123/master betty$ git log --reverse -p origin/master..from/alice/bug/123/master
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.