2012-02-09 59 views
2

旁邊的一個服務器上的主要Git存儲庫(與Gitolite)我想有一個可能性爲每個開發人員建立一個鏡像它自己的本地存儲庫。這並不難。Git掛鉤檢測推 - 鏡像

但是,我想在主Git服務器存儲庫上禁用git push --mirror,以防止開發人員使用鏡像時出錯。我認爲最好的地方是一個鉤子,也許是更新鉤子。但是我找不到如何在服務器鉤子中檢測到push --mirror命令已在客戶機上執行。

客戶端解決方案是不可能的,因爲我們也使用Eclipse Git(JGit)。

+0

http:// stackoverflow。com/questions/5264968/making-git-push-respect-permissions – sehe 2012-02-09 13:49:50

+0

我想保留對主要回購,拉,推,刪除的所有訪問權限。只需禁用推 - 鏡像。 AFAIK文件系統訪問對此沒有幫助。 – xmedeko 2012-02-09 13:59:18

回答

1

如果你真的想用鉤子要做到這一點,使用掛鉤,將pre-receive。你不能直接檢測到它是鏡像推送,因爲沒有任何關於發送數據的內容,但你可以很聰明並且幾乎可以隨時獲得它。預接收鉤子獲取要更新的參數列表,包括舊值和新值,如果它以非零狀態退出,則整個推送被中止。鏡像推送的主要特點可能是它也按照原樣推送遠程分支。我想不出任何正常情況下,你會做這樣的,所以你可以只檢查是否存在,是這樣的:

#!/bin/bash 
while read old new ref; do 
    if [[ "$ref" =~ "^refs/remotes/.*" ]]; then 
     echo "You're pushing remote branches - did you use 'push --mirror'?" 
     echo "Rejecting push" 
     exit 1 
    fi 
done 

任何push --mirror *將啓動此掛鉤,所以它應該包括你;這當然有點過分,但除非你打算在中央倉庫中維護遠程分支機構,否則無關緊要。

*除非是真正手動的版本,某人通過手動指定git push --mirror <url>而從無回收的回購庫中推出,但我真的希望您不必擔心這一點。


我還是希望推薦gitolite。它並不完全讓你拒絕鏡像推送,但它可以有所幫助,並提供了很多其他有用的東西。請注意,gitolite允許你添加自己的鉤子,所以想要使用它不應該阻止你獲得所有gitolite的優點。如果你不打算使用Gitolite,你應該真的在中央回購中將core.logAllRefUpdates設置爲true,這樣如果有人被你推得很不好,你可以恢復。

事情與此相關的問題gitolite願意爲你做:

  • 讓你限制大多數開發商只能夠訪問關鍵的分支機構,並防止他們刪除任何內容(使用RW,不RW+權限) ,所以他們可以做的損害是有限的 - 刪除分支可能是更嚴格的日誌訪問的最差部分,因此如果有人確實會造成破壞,您可以確切地看到他們是誰以及他們做了什麼,以及在將來避免它
+0

工作得很好,非常感謝。消息中應該有正常的撇號:''你在推遠程分支機構 - 你使用'push --mirror'嗎?「 – xmedeko 2012-02-10 08:40:55

+0

@xmdeko哎呀!標記混合,感謝您的支持。 – Cascabel 2012-02-10 16:26:05

2

我不會試圖通過使用鉤子來「修補」安全性。它們不是爲這種類型的訪問控制而設計的。

你可以看看gitolite。它使您能夠在分支機構的基礎上控制訪問。

https://github.com/sitaramc/gitolite/wiki

+0

感謝您的回覆。當我在客戶端上push -mirror時,比gitolite收到的命令是「git-receive-pack」,「git-upload-pack」,就像正常的讀取和推送一樣。所以我不知道如何檢測push -mirror鏡像。 – xmedeko 2012-02-09 14:11:13

+0

好吧,也許這是不可能的。我將不得不繼續push - 鏡像,並製作一些好的備份腳本。謝謝回覆。如果沒有其他答覆會出現,我會將您標記爲已接受。 – xmedeko 2012-02-09 14:13:22