Git chmod समस्या: चेकआउट शिकंजा थोड़ा सा निष्पादित होता है


10

उबंटू और डेबियन के तहत अंतिम प्रतिबद्ध फाइलों को निष्पादन बिट सेट मिल रहा है, जब मैं बाद में एक चेकआउट की कोशिश करता हूं। यह काफी अजीब है और मुझे पागल कर रहा है:

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

किसी को भी एक विचार है, कब और क्यों निष्पादन में फिसल जाता है? core.filemodeपर सेट है true

मेरे पास शाखा स्विचिंग के दौरान फ़ाइल खुली है, अगर यह किसी भी तरह महत्वपूर्ण है।

परिशिष्ट 1: यह चेकआउट है, जहां अनुमतियाँ खराब हो गई हैं। मैं खेल खेल सकता हूँ पर और पर:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

परिशिष्ट 2: यह होता है, वैसे, इस रिपॉजिटरी में प्रत्येक फ़ाइल के लिए, जो मैं करता हूं। सफल कमिटमेंट के बाद मैं बिना अनुमति स्क्रू-अप के ब्रांच को स्विच नहीं कर सकता।


क्या आपने # ठीक-ठीक सभी चरणों में अनुमतियों की जाँच कर ली है ...
RobotHumans

मैं यहां सहमत हूं। देव-शाखा पर, 'गिट-लॉग मास्टर ... HEAD - फ़ाइल' और देखें कि क्या शाखा और अब उस फ़ाइल के बीच कुछ भी बदल गया है।
यूरीस्मैस्टर

@ aking1012: हां, उस बिंदु पर फ़ाइल मोड पहले से ही बदल चुके हैं। मैं सवाल को अपडेट करूंगा।
Boldewyn

@yuriismaster: git-logन तो कोई आउटपुट दिखाता है, न ही संयोजन के लिए master, dev-branchया HEAD(जो अजीब है, है ना? क्या कमांड को अंतिम प्रतिबद्ध संदेश को प्रिंट नहीं करना चाहिए master?)
Boldewyn

2
आप किस फाइलसिस्टम पर हैं?
बिटमैस्क

जवाबों:


12

Git उपयोगकर्ता नहीं, लेकिन मेरा मानना ​​है कि Git संपूर्ण फ़ाइल अनुमति मास्क को संग्रहीत करता है।

इसका मतलब है कि आपने एक बार निष्पादन योग्य फ़ाइल को सेट कर दिया है, जिसे गिट ने उठाया और रिपॉजिटरी में दोहराया गया। इसलिए आपको कमिट करने से पहले फ़ाइल के अनुमति मास्क को स्वयं बदलना होगा।

Git को ऐसे परिवर्तनों को अनदेखा करने के लिए, उपयोग करें

git config core.filemode false

से Git-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

1
वास्तव में, मैं सही अनुमतियों के साथ फ़ाइलों को प्रतिबद्ध करने के लिए कड़ी मेहनत करता हूं। मैं भी उन्हें chmod'ing के बाद सभी फ़ाइलों को फिर से प्रतिबद्ध है। चूंकि मैं समय-समय पर विंडोज पर काम करता हूं (इस रेपो के साथ नहीं, हालांकि), मुझे इसके बारे में पता है core.fileMode, लेकिन मुझे उम्मीद थी कि मैं इसे छोड़ सकता हूं true
Boldewyn

यह भी बग में एक बग हो सकता है जब वे "टूटी हुई फाइल सिस्टम" पर काम करते हैं। कोई टूटे हुए फ़ाइल सिस्टम नहीं हैं, केवल टूटे हुए सॉफ़्टवेयर हैं।
harrymc

4
मुझे गिट डेवलपर्स से सहमत होना होगा कि वसा टूट गया है
रोबॉटहूमन

3
ठीक है, यह फाइल सिस्टम था। मैं इसे दूसरी मशीन पर पुन: पेश नहीं कर सका, जहाँ निर्देशिका NFS के माध्यम से आरोहित है। मुख्य मशीन पर, जैसा कि मैंने कहा, CIFS। जब मैंने git मेलिंग सूची पर पूछा, तो मुझे उत्तर मिला, कि CIFS निष्पादन बिट्स के संबंध में टूट गया है। अरे!
Boldewyn


3

क्या आपने जांच की कि क्या कोई कस्टम हुक है जिसे प्रतिबद्ध या चेकआउट के दौरान निष्पादित किया जाता है? आपकी फ़ाइलों के साथ कुछ कस्टम हुक छेड़छाड़ हो सकती है। चेकआउट githooks manpage

हुक मूल रूप से कुछ कार्यक्रमों (कमिट, चेकआउट आदि) पर गिट द्वारा बुलाए जाने वाले कार्यक्रम हैं।


अच्छी कोशिश, लेकिन मेरी .git/hooksनिर्देशिका अछूती है।
Boldewyn

1

क्या आपने git कमिट-मी 'मोड 644' फ़ाइल को शाखा देव-शाखा पर आज़माया है

मुझे ऐसा लग रहा है कि क्या हो रहा है, आप मुख्य पर अनुमति बदल रहे हैं, फिर देव शाखा को नीचे खींच रहे हैं, जिसकी गलत अनुमति है, जो आपकी स्थानीय अनुमति को रोक रही है। तो फिर से करने की कोशिश कर रहा है। या तो क्लोन, परिवर्तन, प्रतिबद्ध, मर्ज; या फ़ाइल को व्यक्तिगत रूप से एकल फाइल कमिट के साथ देव में बदलने का प्रयास करें


असल में, मैं मूल परिदृश्य में अनुमतियों को कभी नहीं छूता। सभी अनुमति परिवर्तन 'चेकआउट' चरण में गिट द्वारा किया जाता है।
Boldewyn

... यही है, मैंने chmodफ़ाइलों पर एक बार कुछ आईएनजी किया , लेकिन मैं दुर्भाग्य से याद नहीं कर सकता, अगर समस्या ठीक इसके बाद शुरू हुई। मुझे लगता है, यह नहीं किया।
Boldewyn

मैं तुम्हें समस्या दोहराने की कोशिश की और मैं नहीं कर सकते हैं
RobotHumans 20

ऐसा इसलिए है क्योंकि आप एक घुड़सवार CIFS ;-) पर काम नहीं करते हैं। मैं कोशिश के लिए +1 भूल गया, धन्यवाद!
बोल्डवैन

1

इन लिंक्स पर अच्छे उत्तर हैं।

https://stackoverflow.com/questions/9027584/how-to-change-the-file-mode-on-github

तथा

https://stackoverflow.com/questions/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

अनिवार्य रूप से आपको इसकी आवश्यकता है git update-index --chmod=(+|-)x <file>और यह एक बदलाव जोड़ देगा जिसे आपको प्रतिबद्ध होने और अनुमतियों को जोड़ने / हटाने के लिए पुश करने की आवश्यकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.