簡體   English   中英

Git:安全推送非裸存儲庫

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM