2017-06-07 47 views
0

我們有一個使用OpenShift的Git遠程(用於生產)。只允許將一個分支推送到遠端

本地,我想確保只有主分支可以推送到這個遠程。我是否應該採取特殊措施來確保這種情況發生,還是應該只依靠Git默認設置?

我99%確定生產Git遠程只查看主分支。所以我的理解是,我們可以在本地推動不同分支的唯一方法是這樣的:

git push prod_remote a_feature_branch:master 

所以我的問題是 - 有沒有辦法阻止別人對我的團隊這樣做(沒有強制標誌)?

回答

1

接收側,即接收提交的Git有沒有概念的分支名稱,如果有的話,貼在提交上發送的Git。它只知道它已經收到了一些對象,然後是一個請求來更新一些引用。如果這些引用拼寫爲refs/heads/whatever,則它們是名爲whatever的分支的分支名稱創建,刪除或更新操作。

因此,在收到方面,答案是否定的:沒有辦法阻止任何人這樣做。如果他們可以完成提交到接收Git的提交,他們可以提交任何提交以及他們喜歡的任何參考名稱更新。您可以使用任何身份驗證數據(例如,從ssh或像Gitolite這樣的訪問控制系統)檢查提交和/或參考名稱更新,但您對它們的任何內容都不知曉原點,您只有哈希ID和名。

發送方,你可以使用pre-push掛鉤做更多的事情。預推鉤使用:

  • $1:遠程名稱,如果推送使用命名遠程;
  • $2:對應於$1

的URL(如果不使用遠程命名,兩個命令行參數是相同的),和在標準輸入,線的流,每push的Refspec一行與具有四個項目的每一行:

  • 本地REF(例如,refs/heads/branch
  • 本地散列ID
  • 遠程REF
  • 遠程散列ID

(見the githooks documentation細節)。然而,發送端掛鉤取決於每個發送者,因爲每個人都可以完全控制她/他的存儲庫,並且就此而言,是否調用任何掛鉤。

如果大家誰都會自願選擇採用推,你可以爲他們提供了一個鉤子,將:

  • 檢查遠程名稱($1)和/或URL($2);
  • 如果這些匹配您想保護的存儲庫,請檢查輸入流上的任何遠程引用是否匹配refs/heads/master;
  • 如果所有這些檢查都適用,請以您喜歡的任何方式檢查相應的本地ref和/或散列。
+0

謝謝我將盡快研究這件事,欣賞詳細信息 –

+0

事實上,在許多主機系統中,您*可以*防止人們「推動主人」,以防止他們從*修改*分支指針。換句話說,你不會阻止他們在master之上添加兩個新的提交,但是你可以阻止他們將master分支指針移動到這兩個提交的最後,實際上你可以防止它們包含*更多的提交在主人身上。在GitHub上,你可以使用「受保護的分支」來完成一些操作,BitBucket也有類似的功能。 –

+0

@ LasseV.Karlsen:當然,但這並不是他想要的:他想確保沒有人跑'git push remote head:master','git push remote foo:master'或類似的東西,只允許' git推遠程主:主'。受保護的分支僅意味着某些*用戶*(即那些身份驗證痕跡遺留下來的人)可以推送任何*。 – torek