क्या एक रिवाज होना संभव है। केवल पहुंच पढ़ें?


79

मैं टीम के माहौल में काम कर रहा हूं, और पहले से ही एक .gitignoreफाइल है।

मैं .gitignoreफ़ाइल में और आइटम जोड़ना चाहता हूं , लेकिन मैं इस फ़ाइल की जांच नहीं करना चाहता। कस्टम अनदेखा फ़ाइलों को सेट करना संभव है जो केवल मेरे लिए लागू होते हैं?

इसके अलावा, मैं किसी को हमारे सर्वर पर केवल एक निजी गिट रिपॉजिटरी में पढ़ने के लिए एक्सेस देना चाहता हूं, अगर मैं अपने सर्वर में उनकी SSH कुंजी जोड़ देता हूं तो उन्हें बाकी सभी की तरह पूर्ण एक्सेस मिलेगा। मैं इसे केवल पढ़ने के लिए कैसे सीमित कर सकता हूं, कोई भी अनुमति नहीं देता है।


जवाबों:


122
  1. अपने निजी नियमों की अनदेखी करें .git/info/exclude। देखते हैं gitignore(5)
  2. केवल पढ़ने के लिए उपयोग, उपयोग git-daemon, एक वेब सर्वर , या Gitosis, या Gitolite।

और मामले को बदतर बनाने के लिए, मैं चाहता हूं कि यह gitignore एक विशिष्ट परियोजना के लिए हो, न कि वैश्विक सेटिंग के लिए।
ब्लैंकमैन

7
@ ब्लैंकमैन: इसे .git/info/exclude प्रोजेक्ट के रूट डायर में डालें ।
फ्रेड फू

1
इसे पूरा करें: कॉन्फ़िगरेशन विकल्प के साथ core.excludesfileआप एक वैश्विक बहिष्कृत फ़ाइल निर्दिष्ट कर सकते हैं ।
किंगक्रंच

1
किसी भी नए इंस्टॉलेशन के लिए, मैं साइमन से सहमत हूं, आपको गिटोसिस के बजाय जिओलाइट का उपयोग करना चाहिए।
Ebneter

1
इसका उपयोग करने का एक उपयोगी तरीका: पहला -> ln -s .git/info/exclude .personalGitignoreफिर हम # ln -s .git/info/exclude .personalGitignore \n .personalGitignore.gitignore में जोड़ सकते हैं
जोसु गोनी

18

मुझे पता है कि मुझे बातचीत में थोड़ी देर हो गई है, लेकिन आप उपयोग करने पर विचार कर सकते हैं

git update-index --assume-unchanged [ FILE ]

जैसा कि गिट मदद दस्तावेज़ बताता है:

जब "ग्रहण अपरिवर्तित" बिट चालू होता है, तो git संभावित संशोधनों के लिए कार्यशील ट्री फ़ाइलों की जांच करना बंद कर देता है , इसलिए आपको मैन्युअल रूप से बिट को परेशान करने की आवश्यकता होती है जब आप वर्किंग ट्री फ़ाइल को बदलते हैं।

जोर मेरा। यह कहते ही चला जाता है

यह विकल्प हो सकता है ... एक ट्रैक-स्तरीय फ़ाइलों के रूप में अनियोजित परिवर्तनों को अनदेखा करने के लिए एक मोटे फ़ाइल-स्तरीय तंत्र के रूप में उपयोग किया जाता है (अनट्रैक की गई फ़ाइलों के लिए .ignignore क्या करता है)। यदि यह किसी कमेटी में विलय करते समय सूचकांक में इस फ़ाइल को संशोधित करने की आवश्यकता होती है तो जीआईटी (कृपापूर्वक) विफल हो जाएगा; इस प्रकार, यदि मान लिया गया कि अनट्रेक्ड फ़ाइल को अपस्ट्रीम में बदल दिया जाता है, तो आपको स्थिति को मैन्युअल रूप से संभालना होगा

तो बस ध्यान रखें कि आपको इन फ़ाइलों में किए गए किसी भी अपस्ट्रीम परिवर्तन के बारे में पता होना चाहिए।

उस स्थिति में जब आप फ़ाइल को फिर से ट्रैक करना शुरू करना चाहते हैं, जो आपको करना है

git update-index --no-assume-unchange [ FILE ]

मुझे उम्मीद है कि यह इस पोस्ट के किसी भी भविष्य के दर्शकों को मदद करेगा।



2

जैसे फ्रेड फ्रोडो ने कहा, आप अपने निजी बहिष्कृत नियमों .git/info/excludeको भंडार में रख सकते हैं ।

यदि आप अपने मशीन पर सभी रिपॉजिटरी के लिए समान नियम लागू करना चाहते हैं, तो आप .gitconfigअपनी उपयोगकर्ता निर्देशिका में फ़ाइल में निम्न जोड़ सकते हैं ।

[core]       
    excludesfile = /home/<myusername>/.gitexclude 

फिर अपने अपवर्जित प्रतिमानों को इसमें जोड़ें ~/.gitexclude


1

आप एक अपडेट हुक में दिलचस्पी ले सकते हैं जो जूनियो ने लिखा था और कार्ल ने सुधार किया। नीचे दिए गए कोड को रखें $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 उपयोगकर्ता प्रणाली समूह है कि आप सब अपने केंद्रीय भंडार तक पहुँच देता है के एक सदस्य है बनाओ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.