2012-07-16 7 views
7

मैं अपने गिट भंडार की रक्षा करना चाहता हूं ताकि केवल गैर मास्टर शाखाओं को ओवरराइट किया जा सके। क्या केवल चयनित शाखाओं की रक्षा करने का कोई तरीका है?मैं गिट में चयनित शाखा (एसएस) में गैर-फास्टफोर्ड को धक्का कैसे रोक सकता हूं?

उत्तर

4

आप गैर fastforward ब्लॉक करने के लिए सेटअप करने के लिए उपयोग कर सकते हैं GitEnterprise प्रति शाखा अनुमतियाँ (व्यवस्थापक) सुक्ष्म एक्सेस करने की अनुमति का उपयोग कर धक्का।

और git config --system receive.denyNonFastForwards true यदि आप सभी शाखाओं के लिए इतिहास को अवरुद्ध करने की आवश्यकता है तो बस काम करेंगे।

+0

denyNonFastForwards नहीं है 'रिज़ॉल्यूशन' जिसका उपयोग आप करना चाहिए। बल धक्का देने से इनकार करने के लिए एक गिट हुक सेट करें ... ऐसा करने का यह सही तरीका है। – Eric

+0

@Eric अस्वीकार गैर-फास्टफोर्ड धक्का वास्तव में गिटहब/बिटबकेट पर जाने का तरीका है। कोई नई साइकिल का आविष्कार नहीं हुआ। –

+0

यदि आप प्रत्येक शाखा पर सभी गैर फास्टफोर्ड्स से इंकार करते हैं तो आप अपनी फीचर शाखाओं को कैसे मर्ज करेंगे? – Eric

1

This SO answer आपको वह चीज़ देगा जो आप ढूंढ रहे हैं। बस इसे बजाय मास्टर शाखा को लागू करने के लिए संपादित:

#!/bin/sh 
# lock the master branch for pushing 
refname="$1" 

if [ "$refname" = "refs/heads/master" ] 
then 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    echo "You cannot push to the master branch." 
    echo "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" 
    exit 1 
fi 
exit 0 

अद्यतन:
यह सब तेजी से आगे सहित मास्टर शाखा, करने के लिए धक्का नहीं कर पाएगा।

+4

इससे किसी भी चयनित शाखा में धक्का बंद हो जाएगा। फास्ट-फॉरवर्ड धक्का की अनुमति दी जानी चाहिए। –

+0

[यहां, किसी ने यह पता लगाया कि अद्यतन स्क्रिप्ट में मजबूर-नस्ल का पता लगाने के लिए कैसे।] (Http://stackoverflow.com/a/12258773/444255) लंबी व्याख्या, अंतिम स्निपेट अभी भी करने की आवश्यकता है ... –

1

आप denyNonFastForwards

git config --system receive.denyNonFastForwards true 

कॉन्फ़िगर करके गैर तेजी से आगे अद्यतन रोका जा सकता है लेकिन यह सभी शाखाओं के लिए लागू होता है। अधिक जानकारी के लिए कृपया उल्लेख ProGit

0

मुझे लगता है कि यह आपके भंडार तक पहुंचने के लिए सर्वर पक्ष पर आपके द्वारा उपयोग किए जाने वाले कार्यों पर निर्भर करता है। कुछ सर्वर अनुप्रयोग हैं जो प्रति शाखा अनुमतियों का समर्थन करते हैं, जैसे Gerrit या Gitlab (हालांकि, मुझे यकीन नहीं है कि गिटलैब आपके उपयोगकेस का समर्थन करता है)। गेरिट इसका समर्थन करता है, क्योंकि मैं अपनी कंपनी में एक समान वर्कफ़्लो का उपयोग करता हूं।

शायद Gitolite भी इसका समर्थन करता है (यही है कि गिटलैब हुड के नीचे उपयोग करता है), जो सेटअप करना आसान है, लेकिन इसमें गेरिट या गिटलैब जैसे वेबिनटरफेस नहीं हैं।

अतिरिक्त टिप्पणी: सुझाव के अनुसार गिट एंटरप्राइज भी एक अच्छा समाधान है, मेरे सुझाव हालांकि उपयुक्त हैं, यदि आपके पास अपना स्वयं का सर्वर है (जो कई कंपनियों में आम है)।

5

यहां एक अपडेट हुक (हुक/अपडेट की प्रतिलिपि) है जिसे मैंने अपने स्वयं के उपयोग के लिए लिखा था। डिफ़ॉल्ट रूप से यह स्क्रिप्ट सभी गैर-फास्ट-फ़ॉरवर्ड अपडेट से इनकार करती है लेकिन उन्हें स्पष्ट रूप से कॉन्फ़िगर की गई शाखाओं के लिए अनुमति देती है। इसे उलटा करने के लिए पर्याप्त आसान होना चाहिए ताकि मास्टर शाखा के अलावा सभी के लिए गैर-फास्ट-फॉरवर्ड अपडेट की अनुमति हो।

#!/bin/sh 
# 
# A hook script to block non-fast-forward updates for branches that haven't 
# been explicitly configured to allow it. Based on update.sample. 
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new 
# 
# Config 
# ------ 
# hooks.branch.<name>.allownonfastforward 
# This boolean sets whether non-fast-forward updates will be allowed for 
# branch <name>. By default they won't be. 

# --- Command line 
refname="$1" 
oldrev="$2" 
newrev="$3" 

# --- Safety check 
if [ -z "$GIT_DIR" ]; then 
     echo "Don't run this script from the command line." >&2 
     echo " (if you want, you could supply GIT_DIR then run" >&2 
     echo " $0 <ref> <oldrev> <newrev>)" >&2 
     exit 1 
fi 

if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then 
     echo "Usage: $0 <ref> <oldrev> <newrev>" >&2 
     exit 1 
fi 

# --- Check types 
# if $newrev is 0000...0000, it's a commit to delete a ref. 
zero="0000000000000000000000000000000000000000" 
if [ "$newrev" = "$zero" ]; then 
     newrev_type=delete 
else 
     newrev_type=$(git cat-file -t $newrev) 
fi 

case "$refname","$newrev_type" in 
     refs/tags/*,commit) 
       # un-annotated tag 
       ;; 
     refs/tags/*,delete) 
       # delete tag 
       ;; 
     refs/tags/*,tag) 
       # annotated tag 
       ;; 
     refs/heads/*,commit) 
       # branch 
       # git rev-list doesn't print anything on fast-forward updates 
       if test $(git rev-list "$newrev".."$oldrev"); then 
         branch=${refname##refs/heads/} 
         nonfastforwardallowed=$(git config --bool hooks.branch."$branch".allownonfastforward) 

         if [ "$nonfastforwardallowed" != "true" ]; then 
           echo "hooks/update: Non-fast-forward updates are not allowed for branch $branch" 
           exit 1 
         fi 
       fi 
       ;; 
     refs/heads/*,delete) 
       # delete branch 
       ;; 
     refs/remotes/*,commit) 
       # tracking branch 
       ;; 
     refs/remotes/*,delete) 
       # delete tracking branch 
       ;; 
     *) 
       # Anything else (is there anything else?) 
       echo "hooks/update: Unknown type of update to ref $refname of type $newrev_type" >&2 
       exit 1 
       ;; 
esac 

# --- Finished 
exit 0 
+1

यदि आप स्क्रिप्ट में संशोधन कर सकते हैं तो यह उपयोगी होगा ताकि मास्टर शाखा के अलावा सभी के लिए गैर-फास्ट-फ़ॉरवर्ड अपडेट की अनुमति हो – Ren

0

यदि आपको अपने सर्वर को संशोधित करने की अनुमति दी जाएगी, तो यह सर्वर पर फास्ट-फ़ॉरवर्डिंग सक्षम करेगा।

ssh ip 'echo $"[receive] 
    denyDeletes = false 
    denyNonFastForwards = false" >> /path/to/repo/config' 
#then git push -f origin master 
संबंधित मुद्दे