2009-09-06 19 views
176

मैं एक अलग निर्देशिका से Git चलाने के लिए की तुलना में मैं में हूँ कोशिश कर रहा हूँ तो उदाहरण के लिए:।Git --git-निर्देशिका अगर मैं में हूँ काम नहीं कर के रूप में उम्मीद

cd /home/domain/ 
git status << runs perfect ie 
# On branch master 
# Your branch is ahead of 'origin/master' by 6 commits. 

तो अब मैं इस चलाना चाहते हैं --git-dir विकल्प का उपयोग कर एक अलग निर्देशिका से आदेश।

git --git-dir="/home/domain/" status 
## Error 
fatal: Not a git repository: '/home/domain/' 

मैं भी .git फ़ोल्डर यानी

git --git-dir="/home/domain/.git/" status 

शामिल करने के लिए कोशिश की है लेकिन यह लग रहा है जैसे कि यह Git को चलाने के लिए कोशिश कर रहा है:

तो मैं root/ में हूँ कहना है और इस कोशिश की सुविधा देता है रूट से, यानी मेरे डोमेन फ़ोल्डर से सबकुछ हटाना और रूट में सबकुछ जोड़ना।

आशा है कि कोई व्यक्ति जो गलत कर रहा है उस पर सलाह दे सकता है।

+4

अब मैं सही काम कर स्थिति मिला लेकिन पुल दे रहा है त्रुटियों। यानी रूट @ erx [/] # git --git-dir =/home/domain/.git --work-tree =/home/डोमेन/पुल मूल मास्टर घातक:/usr/local/libexec/गिट-कोर/गिट-पुल का उपयोग बिना काम करने वाले पेड़ के किया जा सकता है। लेकिन स्थिति काम करता है ?? कोई विचार जॉन – Lee

+4

यह अभी गिट में सबसे बड़ी बग है। - वर्क-पेड़ और/या - गिट-डीआईआर पैरामीटर का सम्मान नहीं करते हैं। –

+3

गिट 1.8.5 शुरू करना, आपके पास एक आसान कमांड के लिए * नहीं * सेट '--git-dir' और' --work-tree' विकल्प होगा: [मेरा उत्तर नीचे] देखें (http: // stackoverflow। कॉम/ए/20115678/630 9) – VonC

उत्तर

258

आपको कामकाजी डीआईआर को भी परिभाषित करना होगा। उलझन में मुझे पता है लेकिन यह एक लचीलापन चीज है।

git --git-dir=/mycode/.git --work-tree=/mycode status 

आप एक छोटे से अधिक here

+2

धन्यवाद यह काम किया! सहमत हैं कि यह भ्रमित है। इसे Keep It Simple Stupid कहा जाता है। आप लगभग हमेशा लचीलापन की अनुमति दे सकते हैं जबकि एक ही समय में डिफॉल्ट देने वाले सबसे अधिक वीएस को कमांड नहीं करते हैं। – Nay

+3

@ निक सहमत हैं, आपको लगता है कि अगर '--git-dir' निर्दिष्ट नहीं किया गया था, तो यह जांच करेगा कि क्या'/mycode/.git' मौजूद है और त्रुटि को फेंकने से पहले इसका उपयोग करें। – GP89

+3

@ निकीट्स सेकेंड! इसके अलावा मुझे अपनी होम निर्देशिका का संदर्भ देने के लिए ~ समस्या का उपयोग करने में समस्या आई, उदाहरण के लिए 'git --git-dir = ~/src/s3cmd/.git --work-tree = ~/src/s3cmd pull' काम नहीं किया लेकिन 'git --git-dir =/home/username/src/s3cmd/.git --work-tree =/home/username/src/s3cmd pull' –

38

ऊपर अपनी टिप्पणी के आधार पर, यह लग रहा है पढ़ सकते हैं जैसे आप अभी भी एक समस्या में चल रहे हैं:

 
[email protected] [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree 

ऐसा लगता है आप के लिए इच्छुक हो सकता है की तरह इसे crontab या कुछ से चलाएं। पहले अपनी कार्य निर्देशिका में स्विच करने के लिए आप cd का उपयोग कर बेहतर हो सकते हैं। उदाहरण के लिए:

 
[email protected] [/]# (cd /home/domain && git pull origin master) 

यह होगा अस्थायी रूप से /home/domain को वर्तमान निर्देशिका बदलने के लिए, और उसके बाद git pull origin master चलाने (एक subshell है, जो है क्या कोष्ठकों हुए करते हैं)। आदेश पूरा होने के बाद, आपकी वर्तमान निर्देशिका कमांड से पहले जो कुछ भी थी, वह बनी हुई है।

+0

एक सबहेल का उपयोग करना सरल और सुरुचिपूर्ण है। मुझे नहीं पता कि मैंने इससे पहले क्यों नहीं सोचा था! –

+0

क्षमा करें @ ग्रेग ने जॉन द्वारा दूसरे जवाब को वोट दिया क्योंकि उसने पूछा कि सवाल पूछा गया है - लेकिन मुझे लगता है कि आप इरादे और आपकी अंतर्दृष्टि का जवाब देने और जवाब देने के साथ स्पॉट पर हैं यानी() एस, वही है जो मैं +10 की तलाश में था –

96

शुरू git 1.8.5 (जो बाहर अगले सप्ताह होना चाहिए), यह और भी आसान हो जाएगा:

git -C "/home/domain/" status 

अब --git-dir और --work-tree स्थापित करने के लिए कोई ज़रूरत नहीं!


Nazri Ramliy द्वारा commit 44e1e4 देखें:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. :

    यह वर्तमान निर्देशिका से बाहर निकले बिना अधिक keypresses लेता है एक अलग निर्देशिका में Git आदेश को लागू करने की

  4. for d in d1 d2 d3; do (cd $d && git svn rebase); done

ऊपर दिखाए गए तरीकों स्क्रिप्टिंग के लिए स्वीकार्य हैं लेकिन जल्दी कमांड लाइन आमंत्रण के लिए बहुत बोझिल कर रहे हैं।

इस नए विकल्प के साथ, ऊपर कम कीस्ट्रोक्स के साथ किया जा सकता है:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
संबंधित मुद्दे