Git chmod sorunu: Checkout vidaları yürütme biti


10

Ubuntu ve Debian altında, daha sonra bir ödeme yapmayı denediğimde, son taahhüt edilen dosyalar yürütme bitini ayarlıyorlar. Oldukça garip ve beni deli ediyor:

$ 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

Kimse bir fikir var, ne zaman ve neden icra biti kayar? core.filemodeolarak ayarlanmıştır true.

Ben bir şekilde önemli ise, şube anahtarlama sırasında vim içinde dosya var.

Zeyilname 1: İzinlerin bertaraf edildiği ödeme kasasıdır. Oyunu tekrar tekrar oynayabilirim:

$ 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.

Zeyilname 2: Bu arada, bu depodaki her dosya için taahhüt ederim. Başarılı bir taahhüdün ardından izinleri kesmeden şubeleri değiştiremem.


#Seemingly all tamam adımında izinleri kontrol ettiniz mi ...
RobotHumans

Burada katılıyorum. Dev-dalında, 'git-log master ... HEAD - file' ve şube ile şimdi o dosya arasında bir değişiklik olup olmadığını görün.
yuriismaster

@ aking1012: Evet, bu noktada dosya modları zaten değişti. Soruyu güncelleyeceğim.
Boldewyn

@yuriismaster: git-loggösterileri ne kombinasyonu kullanıcılar hiçbir çıkış, master, dev-branchveya HEAD(? garip, verilmemelidir komut son gelen mesajı işlemek baskı değildir master?)
Boldewyn

2
Hangi dosya sistemindesiniz?
bitmask

Yanıtlar:


12

Git kullanıcısı değil, Git'in tüm dosya izin maskesini sakladığına inanıyorum.

Bu, bir zamanlar dosyayı yürütülebilir dosya olarak ayarladığınız anlamına gelir; Git depoda aldı ve çoğalttı. Bu nedenle, taahhütte bulunmadan önce dosyanın izin maskesini değiştirmelisiniz.

Git'in bu tür değişiklikleri yoksaymasını sağlamak için şunu kullanın:

git config core.filemode false

Kaynaktan git-yapılandırma (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
Aslında, dosyaları doğru izinlerle işlemeye çalışıyorum. Hatta tüm dosyaları yeniden oluşturduktan sonra yeniden işledim. Zaman zaman Windows üzerinde çalıştığım için (bu repo ile değil), biliyorum core.fileMode, ama bırakabilmeyi umuyordum true.
Boldewyn

Hatta "bozuk dosya sistemleri" olarak adlandırdıkları şey üzerinde çalışırken git hata olabilir. Kırık dosya sistemleri yoktur, sadece kırık yazılımlar vardır.
harrymc

4
git geliştiriciler ile yağ kırık olduğunu kabul etmek zorunda
RobotHumans

3
Tamam, dosya sistemiydi. Dizinin NFS ile bağlandığı başka bir makinede çoğaltamadım. Ana makinede dediğim gibi CIFS. Git posta listesine sorduğumda, cevapları aldım, CIFS'nin yürütme bitleri nedeniyle kırıldığı. Kahretsin!
Boldewyn


3

Taahhüt veya ödeme sırasında yürütülen özel bir kanca olup olmadığını kontrol ettiniz mi? Dosyalarınızla ilgili bazı özel kancalar olabilir. Ödemeye githooks manpage .

Kancalar, git tarafından belirli olaylarda (taahhüt, ödeme vb.) Çağrılan küçük programlardır.


İyi deneme, ama benim .git/hooksdizin dokunulmamış.
Boldewyn

1

dev-dalda git commit -m 'mode 644' dosya denediniz mi

bana öyle geliyor ki, ana izinleri değiştiriyorsunuz, sonra yanlış izne sahip dev dalını aşağı çekiyorsunuz, yerel izninizi yutuyorsunuz. sonra tekrar taahhüt etmeye çalışıyorum. ya klonlama, değiştirme, taahhüt etme, birleştirme; veya tek bir dosya ile dosyayı tek tek değiştirmeyi deneyin dev içine kaydedip birleştirin


1
Aslında, orijinal senaryoda izinlere asla dokunmuyorum. Tüm izin değişiklikleri 'ödeme' adımında git tarafından yapılır.
Boldewyn

... yani, chmoddosyalarda bir kez yaptım , ama maalesef, sorun hemen sonra ortaya çıkmaya başladıysa hatırlayamıyorum. Bence öyle olmadı.
Boldewyn

size sorunu çoğaltmak için çalıştı ve yapamam
RobotHumans

Bunun nedeni, monte edilmiş bir CIFS ;-) üzerinde çalışmamanızdır. Denemek için + 1'i unuttum, teşekkürler!
Boldewyn

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.