विंडोज पर Git में फाइल एक्जीक्यूट मोड मोड कैसे बनाएं?


377

मैं Windows में Git का उपयोग करता हूं, और एक निष्पादन द्वारा निष्पादन योग्य शेल स्क्रिप्ट को git रेपो में धकेलना चाहता हूं।

आमतौर पर मुझे दो चरण ( git commit) करने की आवश्यकता होती है ।

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

मैं इन दो चरणों को एक चरण में कैसे जोड़ सकता हूं? गिट विन्यास? विंडोज़ कमांड?

रिमाइंड : दो उत्तर अच्छे हैं, git add --chmod=+x fileनए गिट संस्करण में समर्थित है

संदर्भ: दूसरी कमिट के लिए विंडोज पर Git फ़ाइल अनुमतियों में प्रश्न देखें


10
Git 2.9.x / 2.10 (Q3 2016) के साथ, git add --chmod=+xवास्तव में संभव है। देखें नीचे मेरा उत्तर , को ऋण एडवर्ड थॉमसन
VonC

5
यह git add --chmod=+xसंस्करण के लिए चयनित उत्तर को अद्यतन करने के लायक होगा
mikemaccana

जवाबों:


589

दो कमिट में ऐसा करने की कोई आवश्यकता नहीं है, आप फ़ाइल को जोड़ सकते हैं और इसे एक ही प्रतिबद्ध में निष्पादन योग्य चिह्नित कर सकते हैं:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

जैसा कि आप ध्यान दें, जोड़ने के बाद, मोड 0644 है (यानी, निष्पादन योग्य नहीं)। हालाँकि, हम इसे निष्पादित करने से पहले निष्पादन योग्य के रूप में चिह्नित कर सकते हैं:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

और अब फ़ाइल 0755 (निष्पादन योग्य) मोड है।

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

और अब हमारे पास एक एकल निष्पादन योग्य फ़ाइल के साथ एक ही प्रतिबद्ध है।


147

वास्तव में, यह अच्छा होगा अगर git-addएक था --modeझंडा

git 2.9.x / 2.10 (Q3 2016) वास्तव में इसकी अनुमति देगा ( एडवर्ड थॉमसन के लिए धन्यवाद ):

git add --chmod=+x -- afile
git commit -m"Executable!"

यह सभी प्रक्रिया को तेज बनाता है, और भले ही core.filemodeगलत पर सेट हो।

एडवर्ड थॉमसन ( ) द्वारा प्रतिबद्ध 4e55ed3 (31 मई 2016) देखें । मदद-द्वारा: जोहान्स शिंडलिन ( )(द्वारा विलय Junio सी Hamano - - में प्रतिबद्ध c8b080a , 06 जुला 2016)ethomson
dscho
gitster

add: जोड़ें --chmod=+x/ --chmod=-xविकल्प

निष्पादन बिट का पता चला नहीं किया जाएगा (और इसलिए सेट नहीं किया जाएगा) के साथ एक भंडार में पथ के लिए core.filemodeगलत पर सेट है, हालांकि उपयोगकर्ताओं को अब भी अन्य उपयोगकर्ताओं को, जो साथ संगतता के लिए निष्पादन योग्य के रूप में फ़ाइल को जोड़ना चाहते हो सकता है ऐसा है core.filemode कार्यक्षमता।
उदाहरण के लिए, शेल स्क्रिप्ट जोड़ने वाले विंडोज उपयोगकर्ता गैर-विंडोज पर उपयोगकर्ताओं के साथ संगतता के लिए उन्हें निष्पादन योग्य के रूप में जोड़ना चाह सकते हैं।

हालांकि यह एक प्लंबिंग कमांड ( git update-index --add --chmod=+x foo) के साथ किया जा सकता है , कमांड सिखाने से git-addउपयोगकर्ताओं को एक कमांड के साथ निष्पादन योग्य फ़ाइल सेट करने की अनुमति मिलती है जिससे वे पहले से परिचित हैं


22

यदि फ़ाइलों में पहले से ही + x ध्वज सेट है, git update-index --chmod=+xतो कुछ भी नहीं होता है और यह सोचता है कि वहाँ कुछ भी नहीं है, भले ही ध्वज को रेपो में सहेजा नहीं जा रहा हो।

आपको पहले ध्वज को हटाना होगा, गिट कमांड को चलाना होगा, फिर ध्वज को वापस रखना होगा:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

तब git एक परिवर्तन देखता है और आपको परिवर्तन करने की अनुमति देगा।


9

यह नोट सबसे पहले आपको निश्चित रूप से कॉन्फ़िगर git फ़ाइल में filemodeसेट होना चाहिए false, या इस कमांड का उपयोग करना चाहिए :

git config core.filemode false

और फिर आप इस आदेश के साथ 0777 अनुमति सेट कर सकते हैं:

git update-index --chmod=+x foo.sh

3

मेरा cmd.exe में कोई आदेश नहीं है touchऔर chmodमेरे git update-index --chmod=+x foo.shलिए काम नहीं करता है।

मैं अंत में skip-worktreeबिट सेट करके इसे हल करता हूं :

git update-index --skip-worktree --chmod=+x foo.sh
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.