2009-11-02 95 views
39

我有一些通過SSH遠程訪問的git倉庫,我想讓它們中的一些只讀以防止更多的推送。有些人有遙控器指向這些存儲庫。如何使git存儲庫只讀?

這些裸存儲庫初始化爲--shared=group,因此將所有文件的文件權限設置爲660,足以保證允許SSH訪問,但不允許寫入?還是有更簡單的方法?

乾杯。

回答

39

有多種可能的方式來做到這一點。

  • 如果您的用戶都有一個shell賬號(也許是有限的),他們每個人通過自己的帳戶訪問git代碼庫,你可以使用文件系統權限控制到Git倉庫SSH訪問。在Unix上,這些將在目錄上寫入權限,可能在創建組的組和特定權限的幫助下(使用「粘性組ID」設置)。

  • 推進需要git-receive-pack將在用戶的$ PATH,並執行他們...雖然我不知道這種方法是如何可行的是。

  • 您可以使用updatepre-receive做訪問控制庫,例如在git的來源使用update-paranoid例如鉤從contrib/hooks

  • 有了更大的用戶數,你可以與使用工具來管理訪問的git倉庫,像Gitosis(Python中,需要setuptools的)或Gitolite(Perl中)更好。

  • 對於只讀訪問可以設置git daemon提供只讀經由SSH協議通過git://協議匿名(和未)訪問,而不是訪問。

    對於一種方式,以減輕從SSH到GIT協議過渡url.<base>.insteadOf配置變量見文檔。


參見第4章 「Git on the ServerPro Git書由斯科特·查孔(CC-BY-NC-SA許可)。

+2

應該注意,對於文件系統權限,您可以使用chmod,正如Pat Notz所建議的那樣。 – 2009-11-04 16:13:23

+8

感謝您的想法(每個人)。受到更新偏執狂示例鉤子的啓發,我現在在我的回購站中有一個鉤子,它簡單地「echo」關閉所有按鈕「;退出1' – 2009-11-12 21:30:03

+1

@SteveFolly如果你的評論是一個答案,我會投它而不是接受的答案。你的論文短小,重點突出,有效。 – 2015-04-28 06:56:04

3

因爲git主要依賴文件系統進行訪問控制,所以這將起作用。請注意,在您的權限中,世界無權訪問該文件,但用戶和組具有讀/寫訪問權限。如果你想世界可讀,你的權限應該是0444

您可以通過將回購權限設置爲0664(其中用戶爲nobody且該組類似於gitdevs)來做更進一步的細粒度控制。然後,只有gitdevs組中的人才能夠寫回購,但世界可以從中讀取。

後續Here is a link,涵蓋各種方式來分享你的回購和封面來親的&利弊和訪問控制功能。

+0

666是世界上可讀寫的文件。 776是世界和羣體可讀,可寫和可執行的,其他用戶可以讀寫。不知道你在哪裏得到你推薦的號碼,但他們通常是危險的。 – Dustin 2009-11-02 22:50:32

+0

謝謝,糾正了我的答案。打字太多,思維不夠。 – jheddings 2009-11-02 22:58:44

0

另一種可能性是git協議,但它需要git守護進程運行。

1

如果您還需要訪問控制,請查看gitosis。很容易設置,你可以使用一個簡單的腳本來控制誰可以做什麼。

+1

或gitolite:http://github.com/sitaramc/gitolite – 2009-11-02 19:48:21

9
chmod -R a-w /path/to/repo.git 
+0

「使其中一些只讀,以防止更多推動」 - 這將防止拉,不是嗎? – user3175580 2017-10-11 07:30:33

7

一個pre-receive掛鉤,簡單的打印通知消息,退出與非0狀態做這項工作。

假設你把一些有意義的信息,在你的消息,這也減少了從失望的用戶,詢問他們爲什麼不能把查詢:

#!/bin/bash 
echo "==================================================" 
echo "This repository is no longer available for pushes." 
echo "Please visit blah blah yadda yadda ...." 
echo "==================================================" 
exit 1 
0

最近我用限制訪問路徑「/回購。 git/git-receive-pack「來存檔結果,該存儲庫對於某些用戶來說是可讀寫的,而對於其他用戶則是隻讀的。在httpd配置中,它看起來像這樣:

<Location /repo.git/> 
      Require group developers developers-ro 
    </Location> 

    <Location /repo.git/git-receive-pack> 
      Require group developers 
    </Location>