किसी अन्य फ़ोल्डर में git "लॉग" कमांड का उपयोग करें


128

मेरे पास एक फ़ोल्डर ए में कुछ php फाइलें हैं (जो एक git प्रोजेक्ट है)। इन php फ़ाइल में मैं "git log" निष्पादित करना चाहता हूं, लेकिन फ़ोल्डर के लिए B. Folder B एक अन्य git प्रोजेक्ट है (इसलिए लॉग A और B के बीच भिन्न है)।

शेल कमांड के साथ मैं यह कैसे कर सकता हूं?


3
cd /other/dir && git log && cd -बैश शेल में?
ताकेशिन

1
Git 1.8.5 (Q4 2013) के साथ, आपके पास सेटिंग के बजाय एक और विकल्प होगा --git-dir: नीचे मेरा उत्तर देखें
VonC

जवाबों:


189

से, man git :

--git-dirकिसी भी कमांड को पास करने से पहले आप पैरामीटर के साथ ऐसा कर सकते हैं ।

git --git-dir /foo/bar/.git log

( .gitनिर्देशिका निर्दिष्ट करना आवश्यक है।) प्रलेखन से :

--git-dir=<path>

रिपॉजिटरी के लिए रास्ता तय करें। इसे GIT_DIRपर्यावरण चर को सेट करके भी नियंत्रित किया जा सकता है । यह वर्तमान कार्यशील निर्देशिका के लिए एक निरपेक्ष पथ या सापेक्ष पथ हो सकता है।


26
आपको .gitनिर्देशिका का संदर्भ देना होगा । कोशिश करो git --git-dir=/foo/bar/.git log
मिपादी

6
क्षमा करें, मेरा गलत आप = = के बीच में नहीं डाल - निर्देशिका और निर्देशिका नाम। इसलिए यह git --git-dir / foo / bar log
rgngl

23
चेतावनी! इसके अलावा अन्य कार्यों के लिए यह दृष्टिकोण टूट गया है log। कोशिश करें git --git-dir /foo/someclone/.git status- गिट पूरी तरह से भ्रमित हो जाता है। मैं -Cनीचे दिए गए अनुसार सलाह देता हूं ।
वायुसेना

मुझे अभी तक एक जीआईटी मदद पृष्ठ पर आना है जिसमें स्ट्रिंग "--गीत-दिर": '' शामिल है।
थिन्सोल्डियर

1
@thinsoldier man git मेरे सिस्टम (2.3.5) पर करता है। लेकिन @VonC का जवाब बेहतर काम करता है।
कालिमो

144

साथ Git 1.8.5 (Q4 2013) , आप सेटिंग की बजाय, एक और विकल्प होगा --git-dir
यदि आप git logफ़ोल्डर में निष्पादित करना चाहते हैं B, तो टाइप करें:

git -C B log

ठीक वैसे ही जैसे " make -C <directory>", " git -C <directory> ..." गित को कुछ और करने से पहले वहां जाने के लिए कहता है


देखें नाज़री रामली द्वारा प्रतिबद्ध 44e1e4 :

वर्तमान निर्देशिका को छोड़े बिना किसी भिन्न निर्देशिका में git कमांड को लागू करने के लिए अधिक कीपेस लगते हैं:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. 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

19
यह एक बहुत अधिक विश्वसनीय दृष्टिकोण है और इसके अलावा अन्य कमांड के लिए काम करता है log
वायुसेना

वाह, और मैन पेज में कुछ भी नहीं! कितनी शर्म की बात है। (ठीक है, अब मैं इसे 2.7 मैन पेज में जोड़कर देखता हूं)
akostadinov

अफसोस की बात है, यह अभी भी मर्क्यूरियल के -Rविकल्प के रूप में काफी अच्छा नहीं है , क्योंकि यह सापेक्ष रास्तों को गड़बड़ करता है। उदाहरण के लिए, यदि मैं टाइप git -C subdir log subdir/myfileकरता हूं तो यह एक त्रुटि देता है (क्योंकि यह फ़ाइल के लिए दिखता है subdir/subdir/myfile)।
jwd

जब आप कुछ इस तरह से करते हैं तो for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
नित

1
@jwd: मुझे यकीन नहीं है कि यह कैसे एक समस्या है? आपने जो उद्धृत किया है वह सटीक व्यवहार है जिसकी मैं अपेक्षा करूंगा, और मैं यह नहीं gitसोचना चाहूंगा कि यह मुझसे अधिक चतुर था और मैंने जो लिखा था। अगर मैं कहता हूं 'इसे डायरेक्टरी एक्स में चलाएं', मेरा मतलब यह नहीं है कि 'कभी-कभी को छोड़कर, कुछ और करें'।
अंडरस्कोर_ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.