कहो कि मैं यह कर रहा हूँ:
cd subdir
git init
cd ../
वहाँ एक कमांड के साथ ऐसा करने का एक तरीका है, या शायद दो, बजाय एक कमांड चलाने के लिए एक निर्देशिका में और बाहर ले जाने के लिए?
(जीआईटी-विशिष्ट समाधान की तलाश नहीं है; यह सिर्फ एक उदाहरण है।)
कहो कि मैं यह कर रहा हूँ:
cd subdir
git init
cd ../
वहाँ एक कमांड के साथ ऐसा करने का एक तरीका है, या शायद दो, बजाय एक कमांड चलाने के लिए एक निर्देशिका में और बाहर ले जाने के लिए?
(जीआईटी-विशिष्ट समाधान की तलाश नहीं है; यह सिर्फ एक उदाहरण है।)
जवाबों:
यह अक्सर सबसे अच्छा तरीका है:
( cd dir ; git init )
या
( cd dir && git init )
यह बहुत छोटा है और टाइप करना आसान है। यह एक उप-शेल शुरू करता है, इसलिए आप अपने पर्यावरण को उससे संशोधित नहीं कर सकते हैं, लेकिन यह यहां एक मुद्दा नहीं लगता है।
$?
उप कमांड में अंतिम कमांड का निकास कोड होगा। यदि आप &&
वैरिएंट का उपयोग करते हैं (जो आपको आमतौर पर करना चाहिए), तो आपको पहले कमांड का एग्जिट कोड मिलेगा जो विफल रहा (या यदि सब ठीक है तो 0)।
मैं एक रास्ते से गिट कमांड को निष्पादित करने और एक अलग पथ में रिपॉजिटरी में परिवर्तन करने के लिए एक रास्ता ढूंढ रहा था। इसलिए मैं यहां इस सवाल पर समाप्त हुआ।
लेकिन मेरी विशिष्ट जरूरतों के लिए न तो स्वीकृत उत्तर और न ही किसी अन्य ने मदद की।
मुझे git कमांड चलाने की आवश्यकता है sudo -u USER /usr/bin/git
(दूसरे उपयोगकर्ता इसे चला रहे हैं)। और जैसा कि आप जानते हैं, sudo मुझे cd
कमांड चलाने की अनुमति नहीं देता है , इसलिए मैं रिपॉजिटरी डायरेक्टरी में नहीं हो सकता ।
तो, मैं git के मैन पेज पर गया । और विकल्पों में से, मैंने देखा --git-dir=<path>
:
--git-dir =
रिपॉजिटरी के लिए रास्ता तय करें। इसे GIT_DIR पर्यावरण चर सेट करके भी नियंत्रित किया जा सकता है। यह वर्तमान कार्यशील निर्देशिका के लिए एक निरपेक्ष पथ या सापेक्ष पथ हो सकता है।
इसलिए, यदि यह किसी की मदद करता है, तो आप अभी भी एक पथ से गिट का उपयोग कर सकते हैं और "दूर दूर से" एक भंडार में परिवर्तन कर सकते हैं। महज प्रयोग करें:
git --git-dir=/path/to/repository GIT_COMMAND
या, इसे किसी अन्य उपयोगकर्ता के रूप में चलाने के लिए, कुछ ऐसा करें:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository GIT_COMMAND
इसके अलावा से Git-init के आदमी पेज :
यदि $ GIT_DIR पर्यावरण चर सेट है तो यह रिपॉजिटरी के आधार के लिए ./.git के बजाय उपयोग करने के लिए एक पथ निर्दिष्ट करता है।
इसलिए, यदि आप सामान्य .git फ़ोल्डर के तहत रिपॉजिटरी में प्रवेश करना चाहते हैं, तो आपको --git-dir
विकल्प के साथ इसे निर्दिष्ट करना होगा । उदाहरण के लिए:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
रिपॉजिटरी को शुरू करने के बाद /path/to/repo/.git
, आगे के सभी आदेशों में विकल्प होना चाहिए --work-tree=<path>
, जैसा कि git के मैन पेज पर वर्णित है:
--work पेड़ =
काम करने वाले पेड़ के लिए रास्ता निर्धारित करें। यह वर्तमान कार्य निर्देशिका के सापेक्ष एक निरपेक्ष पथ या पथ हो सकता है। इसे GIT_WORK_TREE परिवेश चर और core.worktree कॉन्फ़िगरेशन चर सेट करके भी नियंत्रित किया जा सकता है (अधिक विस्तृत चर्चा के लिए git-config (1) में core.worktree देखें)।
इसलिए, एक अन्य उपयोगकर्ता के रूप में गिट चलाने के लिए सही कमांड, और एक नया भंडार शुरू करना है:
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir=/path/to/repository/.git init
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' add /path/to/repository/*
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' commit -m 'MESSAGE'
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' remote add origin user@domain.com:path
echo USER_PASSWORD | sudo -u USER_LOGIN -S /usr/bin/git --git-dir='/path/to/repository/.git' --work-tree='/path/to/repository' push -u origin master
sudo -i
या sudo su
कर सकते हैं।
( cd subdir && sudo -u USER /usr/bin/git init )
काम क्यों नहीं करेगा।
subdir
?
आप जो पूछ रहे हैं ठीक वैसा ही नहीं (आपके पास उप-उत्तर के साथ वास्तविक उत्तर हैं) लेकिन देखो pushd
औरpopd
आपके पास कुछ विकल्प हैं। आप या तो के साथ आदेश समूह कर सकते हैं &&
या ;
। ऐशे ही:
cd subdir && git init && cd ..
या
cd subdir; git init; cd ..
इनमें अंतर यह है कि पहले उदाहरण में, यदि कोई आदेश विफल रहता है, तो यह उनमें से बाकी को निष्पादित नहीं करेगा। दूसरे उदाहरण में, सभी कमांड्स चलेंगे चाहे कोई भी हो।
एक अन्य विकल्प एक समारोह को परिभाषित करना और इसका उपयोग करना होगा, उदाहरण के लिए:
function cdinit() {
cd $1
git init
cd ..
}
तब आप कमांड चला सकते हैं:
cdinit subdir
और यह स्वचालित रूप git init
से उस निर्देशिका में होगा और इससे बाहर निकल जाएगा।
यदि आप निर्देशिकाओं का एक गुच्छा है और git init
एक कमांड के साथ उन्हें चाहते हैं तो आप फ़ंक्शन का उपयोग करके एक अधिक जटिल समाधान भी कर सकते हैं ।
function cdinit() {
for arg in $@
do
cd $arg
git init
cd ..
done
}
इसके बाद आप इसे चला सकते हैं:
cdinit subdir1 subdir2 subdir3
और यह करना होगा git init
में subdir1
, subdir2
, और subdir3
।
&&
और ;
, लेकिन कुछ और सुरुचिपूर्ण के लिए आशा व्यक्त की। स्क्रिप्ट लिखने की तरह लगता है मेरा सबसे अच्छा विकल्प है।
cdinit
मनमाने आदेशों के लिए आपके कार्य को सामान्यीकृत किया जा सकता है? मैंने सिर्फ तर्कों का उपयोग करने की कोशिश की, लेकिन यह काम नहीं किया।
;
, ताकि तीन-लाइन फ़ंक्शन के बराबर हो cd $1; git init; cd ..
। (2) आप अपने चर बोली चाहिए: "$1"
, "$@"
और "$arg"
। या फिर आप को संक्षिप्त कर सकते हैं for arg in "$@"
करने के लिए for arg
।
git
(कम से कम संस्करण 2.7.0 में) के मामले में , आप उस -C
विकल्प का लाभ उठा सकते हैं जो गिट व्यवहार करता है जैसे कि यह दी गई निर्देशिका में शुरू किया गया था। तो आपके समाधान की तरह लग सकता है:
> git -C subdir init
Initialized empty Git repository in /some/path/subdir/.git/
दस्तावेज का हवाला देते हुए:
Run as if git was started in <path> instead of the current working directory. When multiple -C options are given, each subsequent non-absolute -C
<path> is interpreted relative to the preceding -C <path>.
This option affects options that expect path name like --git-dir and --work-tree in that their interpretations of the path names would be made
relative to the working directory caused by the -C option.
आप आदेशों को &&, यानी के साथ समूहीकृत कर सकते हैं
cd subdir && git init && cd ../
यदि आप प्रत्येक कमांड के निकास कोड पर कोई निर्भरता नहीं चाहते हैं, तो आप उपयोग कर सकते हैं; इसके बजाय, यानी:
cd subdir ; git init ; cd ../
;
कि वे पिछले एक के रिटर्न कोड पर निर्भर न हों।
cd subdir && git init ; cd ..
वास्तव में सबसे अधिक समझदारी हो सकती है। यदि उपयोगकर्ता git init
कमांड चलाना चाहता है subdir
, तो वे संभवतः वर्तमान निर्देशिका में कमांड चलाना नहीं चाहते हैं; यदि वे (पहले) cd
विफल होते हैं, तो वे इसे चलाना नहीं चाहते हैं । (यद्यपि यह संभव है कि cd
हम पहले से ही असफल हों subdir
, लेकिन यह एक कोने का मामला है।)… (Cont'd)
cd
शुरू करने निर्देशिका भले ही करने के लिए बैकअप लेने के git init
आदेश विफल रहता है। ( या, वे उपनिर्देशिका में रहना चाहते हैं और कमांड विफलता का निदान कर सकते हैं।) (2) आपको /
बाद में शामिल करने की आवश्यकता नहीं है ..
।
यदि कमांड में फ़ाइल नाम या निर्देशिका नाम पैरामीटर नहीं है, तो आपको अपने लक्ष्य-निर्देशिका में हॉप करना होगा।
लेकिन आप एक बैश स्क्रिप्ट लिख सकते हैं जो लक्ष्य निर्देशिका और कमांड को पैरामीटर के रूप में लेती है। इसके लिए आप pushd और popd: http://ss64.com/bash/pushd.html पर नज़र डाल सकते हैं
मैं आपके लिए वह छोटी सी स्क्रिप्ट लिखूंगा, लेकिन मैंने यहां लिनक्स बॉक्स नहीं बनाया है :)
कार्यक्रमों में तर्कों को संभालने के अलग-अलग तरीके हैं, इसलिए कुछ में कुछ समतुल्य- फ़ोल्डर = नाम विकल्प होगा। उस अपवाद से परे, एमएस डॉस पर भी मानक, बस है
$ कार्यक्रम उप
कभी-कभी आपकी जरूरत होती है
$ कार्यक्रम उपखंड /
कार्यक्रम फ़ोल्डर को खोलेगा, इसके साथ उसी तरह काम करें जैसे आप एक फ़ाइल के साथ काम करते हैं, और एक बार समाप्त होने के बाद, अपने शेल पर नियंत्रण लौटाएं, जो आपके मूल मानक निर्देशिका में बताया गया है। प्रोग्राम्स ने इस तरह से संभाला है कि क्या समस्या है कि त्रुटि आउटपुट (जैसे कोर डंप) आपके शेल की वर्तमान निर्देशिका में फ़ाइल में जाते हैं ( उपखंड के बजाय )।
जब तक प्रोग्राम में भिन्न स्थान निर्दिष्ट करने के लिए कमांड स्विच उपलब्ध नहीं है तब तक कोई वर्कअराउंड नहीं है। कुछ प्रोग्रामर "निर्देशिका प्रोग्राम से बुलाया गया था " और "निर्देशिका प्रोग्राम को काम करने के लिए कहा गया था" के बीच कलात्मक लाइसेंस लेते हैं ।