आप एक अपडेट हुक में दिलचस्पी ले सकते हैं जो जूनियो ने लिखा था और कार्ल ने सुधार किया। नीचे दिए गए कोड को रखें $GIT_DIR/hooks/update
और इसे सक्षम करना न भूलें chmod +x
।
#!/bin/bash
umask 002
# If you are having trouble with this access control hook script
# you can try setting this to true. It will tell you exactly
# why a user is being allowed/denied access.
verbose=false
# Default shell globbing messes things up downstream
GLOBIGNORE=*
function grant {
$verbose && echo >&2 "-Grant- $1"
echo grant
exit 0
}
function deny {
$verbose && echo >&2 "-Deny- $1"
echo deny
exit 1
}
function info {
$verbose && echo >&2 "-Info- $1"
}
# Implement generic branch and tag policies.
# - Tags should not be updated once created.
# - Branches should only be fast-forwarded unless their pattern starts with '+'
case "$1" in
refs/tags/*)
git rev-parse --verify -q "$1" &&
deny >/dev/null "You can't overwrite an existing tag"
;;
refs/heads/*)
# No rebasing or rewinding
if expr "$2" : '0*$' >/dev/null; then
info "The branch '$1' is new..."
else
# updating -- make sure it is a fast-forward
mb=$(git-merge-base "$2" "$3")
case "$mb,$2" in
"$2,$mb") info "Update is fast-forward" ;;
*) noff=y; info "This is not a fast-forward update.";;
esac
fi
;;
*)
deny >/dev/null \
"Branch is not under refs/heads or refs/tags. What are you trying to do?"
;;
esac
# Implement per-branch controls based on username
allowed_users_file=$GIT_DIR/info/allowed-users
username=$(id -u -n)
info "The user is: '$username'"
if test -f "$allowed_users_file"
then
rc=$(cat $allowed_users_file | grep -v '^#' | grep -v '^$' |
while read heads user_patterns
do
# does this rule apply to us?
head_pattern=${heads#+}
matchlen=$(expr "$1" : "${head_pattern#+}")
test "$matchlen" = ${#1} || continue
# if non-ff, $heads must be with the '+' prefix
test -n "$noff" &&
test "$head_pattern" = "$heads" && continue
info "Found matching head pattern: '$head_pattern'"
for user_pattern in $user_patterns; do
info "Checking user: '$username' against pattern: '$user_pattern'"
matchlen=$(expr "$username" : "$user_pattern")
if test "$matchlen" = "${#username}"
then
grant "Allowing user: '$username' with pattern: '$user_pattern'"
fi
done
deny "The user is not in the access list for this branch"
done
)
case "$rc" in
grant) grant >/dev/null "Granting access based on $allowed_users_file" ;;
deny) deny >/dev/null "Denying access based on $allowed_users_file" ;;
*) ;;
esac
fi
allowed_groups_file=$GIT_DIR/info/allowed-groups
groups=$(id -G -n)
info "The user belongs to the following groups:"
info "'$groups'"
if test -f "$allowed_groups_file"
then
rc=$(cat $allowed_groups_file | grep -v '^#' | grep -v '^$' |
while read heads group_patterns
do
# does this rule apply to us?
head_pattern=${heads#+}
matchlen=$(expr "$1" : "${head_pattern#+}")
test "$matchlen" = ${#1} || continue
# if non-ff, $heads must be with the '+' prefix
test -n "$noff" &&
test "$head_pattern" = "$heads" && continue
info "Found matching head pattern: '$head_pattern'"
for group_pattern in $group_patterns; do
for groupname in $groups; do
info "Checking group: '$groupname' against pattern: '$group_pattern'"
matchlen=$(expr "$groupname" : "$group_pattern")
if test "$matchlen" = "${#groupname}"
then
grant "Allowing group: '$groupname' with pattern: '$group_pattern'"
fi
done
done
deny "None of the user's groups are in the access list for this branch"
done
)
case "$rc" in
grant) grant >/dev/null "Granting access based on $allowed_groups_file" ;;
deny) deny >/dev/null "Denying access based on $allowed_groups_file" ;;
*) ;;
esac
fi
deny >/dev/null "There are no more rules to check. Denying access"
इस हुक के साथ, आप फिर रिपॉजिटरी में बदलाव करने के लिए विशेष उपयोगकर्ताओं या समूहों को देते हैं। जो कोई भी इसे देख सकता है उसके पास केवल-पढ़ने के लिए पहुंच है।
यह दो फ़ाइलों का उपयोग करता है, $GIT_DIR/info/allowed-users
और allowed-groups
, यह बताने के लिए कि किन प्रमुखों को किसके द्वारा धकेला जा सकता है। प्रत्येक फ़ाइल का प्रारूप इस तरह दिखेगा:
refs/heads/master junio
+refs/heads/pu junio
refs/heads/cogito$ pasky
refs/heads/bw/.* linus
refs/heads/tmp/.* .*
refs/tags/v[0-9].* junio
इसके साथ, लिनुस धक्का दे सकता है या बना bw/penguin
सकता है bw/zebra
या bw/panda
शाखाएं बना सकता है, पास्करी केवल कर सकता है cogito
, और जेसी कर सकते हैं master
और pu
शाखाएं बना सकते हैं और संस्करण बना सकते हैं । और कोई भी tmp/blah
शाखाएं कर सकता है । pu
रिकॉर्ड में '+' चिन्ह का मतलब है कि JC उस पर गैर-तेज़-फ़ॉरवर्ड पुश कर सकता है।
यदि इस व्यक्ति के पास पहले से ही होस्ट की पहुंच नहीं है, जहां आपकी रिपॉजिटरी रहती है, तो हो सकता है कि उस व्यक्ति के पास git-shell
अप्रतिबंधित एक्सेस के बजाय केवल एक्सेस होना चाहिए । एक विशेष उद्देश्य git उपयोगकर्ता और में बनाएँ~git/.ssh/authorized_keys
, बाहरी व्यक्ति की SSH कुंजी को निम्न रूप में जोड़ें। ध्यान दें कि कुंजी एक लंबी रेखा पर होनी चाहिए, लेकिन मैंने इसे प्रस्तुति में सहायता के लिए नीचे लपेट दिया है।
नो-एजेंट-फ़ॉरवर्डिंग, नो-पोर्ट-फ़ॉरवर्डिंग, नो-पीटी, नो-एक्स 11-फ़ॉरवर्डिंग,
कमांड = "env myorg_git_user = joeuser / usr / स्थानीय / बिन / गिट-शेलक
\ "$ {SSH_ORIGINAL_COMMAND: -} \" ssh-rsa AAAAB3 ... 2iQ == joeuser@foo.invalid
अपने स्थानीय सेटअप के आधार पर, आपको पथ को समायोजित करने की आवश्यकता हो सकती है git-shell
। याद रखें कि निर्देशिका sshd
की अनुमतियों के बारे में अत्यधिक पागल है .ssh
, इसलिए इसके समूह-लेखन बिट्स और इसके नीचे की सभी फ़ाइलों को बंद करें।
Git उपयोगकर्ता के माध्यम से सभी को फ़नलिंग करने का मतलब है कि आपको लोगों को अलग-अलग बताने में सक्षम होने की आवश्यकता है, और यह myorg_git_user
पर्यावरण चर का उद्देश्य है । बिना शर्त पर भरोसा करने के बजाय username=$(id -u -n)
, इसका उपयोग करने के लिए अपने अपडेट हुक को ट्विस्ट करें:
# Implement per-branch controls based on username
allowed_users_file=$GIT_DIR/info/allowed-users
if [ -z "$myorg_git_user" ]; then
username=$(id -u -n)
else
username=$myorg_git_user
fi
info "The user is: '$username'"
इस सेटअप के साथ, आपका मित्र आसानी से एक्सेस कर सकता है, जो नीचे दिए गए कमांड के समान होगा। विशेष पथ आपके सेटअप पर निर्भर करेगा। अच्छा पथ कार्य करने के लिए, या तो अपने रिपॉजिटरी को git उपयोगकर्ता के होम डायरेक्टरी में स्थानांतरित करें या एक सिमलिंक बनाएं जो इसे इंगित करता है।
$ git क्लोन क्लोन git@blankman.com.invalid: coolproject.git
लेकिन अपडेट नहीं कर पाएंगे।
$ git धक्का मूल mybranch
कुल 0 (डेल्टा 0), पुन: उपयोग किया गया 0 (डेल्टा 0)
रिमोट: त्रुटि: हुक ने refs / heads / mybranch को अपडेट करने से मना कर दिया
Git@blankman.com.invalid पर: coolproject.git
! [रिमोट खारिज] mybranch -> mybranch (हुक अस्वीकृत)
त्रुटि: कुछ संदर्भों को 'git@blankman.com.invalid: coolproject.git' पर धकेलने में विफल रही
आपने कहा कि आप टीम के माहौल में काम कर रहे हैं, इसलिए मुझे लगता है कि आपका केंद्रीय भंडार --shared
विकल्प के साथ बनाया गया था । (देखें core.sharedRepository
में git config
प्रलेखन और --shared
में git init
प्रलेखन ।) सुनिश्चित करें कि नया Git उपयोगकर्ता प्रणाली समूह है कि आप सब अपने केंद्रीय भंडार तक पहुँच देता है के एक सदस्य है बनाओ।