git - with - एक गिट निर्देशिका में नहीं, जबकि गिट खींचें




integrate git bash with visual studio code (6)

मान लें कि मेरे पास एक निर्देशिका है, /X/Y , जो एक गिट भंडार है। क्या किसी भी तरह से अंदर /X से git pull जैसे कमांड को कॉल करना संभव है, लेकिन /X/Y निर्देशिका को लक्षित करना संभव है?

संपादित करें: मुझे लगता है कि मैं विशेष रूप से सोच रहा था: क्या यह गिट कमांड का उपयोग करके ऐसा करना संभव है, लेकिन निर्देशिकाओं को बदलने के बिना?

नोट: मैंने वॉनसी के जवाब को स्वीकार कर लिया है क्योंकि यह पिछले विकल्पों की तुलना में अधिक सुरुचिपूर्ण है। 1.8.5 से अधिक पुराने गिट चलाने वाले लोगों के लिए, कृपया नीचे bstpierre का उत्तर देखें


आप इस तरह एक स्क्रिप्ट लिख सकते हैं:

cd /X/Y
git pull

आप इसे gitpull तरह कुछ नाम दे सकते हैं।
यदि आप इसके बजाय /X/Y बजाय मनमानी निर्देशिका करना चाहते हैं:

cd $1
git pull

फिर आप इसे gitpull /X/Z साथ कॉल कर सकते हैं
अंत में, आप भंडार खोजने की कोशिश कर सकते हैं। मेरे पास एक ~/git फ़ोल्डर है जिसमें भंडार शामिल हैं, और आप इसका उपयोग उन सभी पर खींचने के लिए कर सकते हैं।

g=`find /X -name .git`
for repo in ${g[@]}
do
    cd ${repo}
    cd ..
    git pull
done

आप इसे एक बैश स्क्रिप्ट या गिट उपनाम में लपेट सकते हैं:

cd /X/Y && git pull && cd -

मेरे जैसे किसी भी व्यक्ति के लिए जो दूरस्थ सर्वर पर एक ड्रश (ड्रूपल खोल) कमांड के माध्यम से ऐसा करने का प्रयास कर रहा था, आप उस समाधान का उपयोग करने में सक्षम नहीं होंगे जिसके लिए आपको कार्यशील निर्देशिका में सीडी की आवश्यकता होती है:

इसके बजाय आपको उस समाधान का उपयोग करने की आवश्यकता है जो पुल को खींचने और विलय करने में टूट जाती है:

drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH fetch origin
drush @remote exec git --git-dir=/REPO/PATH --work-tree=/REPO/WORKDIR-PATH merge origin/branch

यह एक समान समस्या हो सकती है, लेकिन आप आसानी से अपने आदेशों को भी श्रृंखलाबद्ध कर सकते हैं। जैसे

एक पंक्ति पर

cd ~/Sites/yourdir/web;git pull origin master

या एसएसएच के माध्यम से।

ssh [email protected] -t "cd ~/Sites/thedir/web;git pull origin master"

गिट 1.8.5 (क्यू 4 2013) शुरू करना, आप "गिट कमांड का उपयोग कर सकते हैं, लेकिन निर्देशिकाओं को बदलने के बिना"।

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

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

वर्तमान निर्देशिका को छोड़े बिना एक अलग निर्देशिका में गिट कमांड को आमंत्रित करने के लिए और अधिक कीप्रेसियां ​​लेती हैं:

  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

गिट 2.3.4 (मार्च 2015) के बाद से, और कार्तिक नायक ( KarthikNayak ) द्वारा 6 ए 536e2 को प्रतिबद्ध करते हुए, git " git -C '<path>' " को नो-ऑप के रूप में KarthikNayak जब <path> खाली होता है।

' git -C "" अनुपस्थिति से त्रुटि के साथ मर जाता है " Cannot change to '' , जबकि शैल सीडी" "को नो-ऑप के रूप में मानता है।
शेल के व्यवहार को एक उदाहरण के रूप में लेते हुए, सी-"" को नो-ऑप के रूप में भी इलाज करने के लिए git सिखाएं।


संपादित करें :

git pull साथ या तो एक बग है, या आप वह आदेश नहीं कर सकते जो आप उस कमांड के साथ करने की कोशिश कर रहे हैं। हालांकि, आप इसे लाने और विलय के साथ कर सकते हैं :

cd /X
git --git-dir=/X/Y/.git fetch
git --git-dir=/X/Y/.git --work-tree=/X/Y merge origin/master

मूल उत्तर :

मान लें कि आप बैश या इसी तरह चल रहे हैं, आप कर सकते हैं (cd /X/Y; git pull)

गिट मैन पेज कुछ चर निर्दिष्ट करता है (देखें "गिट रिपोजिटरी") जो ऐसा लगता है कि उन्हें मदद करनी चाहिए, लेकिन मैं उन्हें सही काम नहीं कर सकता (मेरे भंडार में / tmp / ggg2 में):

GIT_WORK_TREE=/tmp/ggg2 GIT_DIR=/tmp/ggg2/.git git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

नीचे दिए गए आदेश को चलाते हुए मेरे cwd / tmp अद्यतन repo है, लेकिन अद्यतन फ़ाइल / tmp / ggg2 के बजाय अद्यतन फ़ाइल / tmp में दिखाई देती है:

GIT_DIR=/tmp/ggg2/.git git pull

यह जवाब भी इसी तरह के प्रश्न के लिए देखें, जो --git-dir --work-tree --git-dir और - --work-tree झंडे का प्रदर्शन करता है।





git