Git chmod masalah: Checkout sekrup exec bit

10

Di bawah Ubuntu dan Debian file yang dikomit terakhir mendapatkan bit eksekusi, ketika saya mencoba checkout setelahnya. Cukup aneh dan membuatku gila:

$ 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

Adakah yang tahu, kapan dan mengapa bit eksekusi tergelincir? core.filemodediatur ke true.

Saya memiliki file terbuka di vim selama perpindahan cabang, jika itu penting entah bagaimana.

Tambahan 1: Ini checkout, di mana izin kacau. Saya bisa memainkan game ini terus-menerus:

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

Tambahan 2: Ini terjadi, omong-omong, untuk setiap file dalam repositori ini, yang saya komit. Setelah komit berhasil, saya tidak bisa berganti cabang tanpa izin izin.

Boldewyn
sumber
Sudahkah Anda memeriksa izin pada langkah # yang tampaknya semua ok ...
RobotHumans
Saya setuju di sini. Pada dev-branch, 'git-log master ... HEAD - file' dan lihat apakah ada yang berubah antara cabang dan sekarang pada file itu.
yuriismaster
@ aking1012: Ya, pada saat itu mode file sudah berubah. Saya akan memperbarui pertanyaan.
Boldewyn
@ yuriismaster: git-logtidak menunjukkan keluaran sama sekali, untuk kombinasi master, dev-branchatau HEAD(yang aneh, bukan? Bukankah seharusnya perintah mencetak pesan komit terakhir dari master?)
Boldewyn
2
Sistem file apa yang Anda pakai?
bitmask

Jawaban:

12

Bukan pengguna Git, tapi saya percaya bahwa Git menyimpan seluruh topeng izin file.

Itu berarti Anda pernah mengatur file menjadi executable, yang diambil dan direplikasi Git di repositori. Karena itu Anda harus mengubah sendiri topeng izin file sebelum melakukan.

Untuk membuat Git mengabaikan perubahan seperti itu, gunakan

git config core.filemode false

Dari 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.
harrymc
sumber
1
Sebenarnya, saya berusaha keras untuk melakukan file dengan izin yang benar. Saya bahkan melakukan kembali semua file setelah chmod'ing mereka. Karena saya bekerja di Windows dari waktu ke waktu (tidak dengan repo ini), saya tahu core.fileMode, tetapi saya berharap dapat meninggalkannya true.
Boldewyn
Bahkan mungkin ada bug di git ketika mengerjakan apa yang mereka sebut "sistem file yang rusak". Tidak ada sistem file yang rusak, hanya perangkat lunak yang rusak.
harrymc
4
saya harus setuju dengan para pengembang git bahwa lemak rusak
RobotHumans
3
OK, itu sistem file. Saya tidak dapat mereproduksi di komputer lain, di mana direktori tersebut dipasang melalui NFS. Pada mesin utama, seperti yang saya katakan, CIFS. Ketika saya bertanya pada mailing list git, saya mendapat jawabannya, bahwa CIFS rusak terkait bit eksekusi. Menisik!
Boldewyn
3

Apakah Anda memeriksa apakah ada pengait kustom yang dieksekusi selama komit atau checkout? Mungkin ada beberapa kait kustom yang merusak file Anda. Checkout githooks manualnya .

Hooks pada dasarnya adalah program kecil yang dipanggil oleh git di acara-acara tertentu (komit, checkout, dll.).

bandi
sumber
Selamat mencoba, tetapi .git/hooksdirektori saya tidak tersentuh.
Boldewyn
1

Anda sudah mencoba git commit -m 'mode adalah file 644' di cabang dev-branch

bagi saya sepertinya apa yang terjadi adalah Anda mengubah izin pada main lalu menarik ke bawah cabang dev yang memiliki izin salah, mengalahkan izin lokal Anda. lalu coba komit lagi. baik mengkloning, mengubah, melakukan, menggabungkan; atau coba ubah file satu per satu dengan satu file komit menjadi dev lalu gabungkan

RobotHumans
sumber
1
Sebenarnya, saya tidak pernah menyentuh izin dalam skenario asli. Semua perubahan izin dilakukan oleh git di langkah 'checkout'.
Boldewyn
... yaitu, saya melakukan beberapa chmodkali pada file, tapi sayangnya saya tidak ingat, jika masalah mulai terjadi setelahnya. Saya pikir tidak.
Boldewyn
saya mencoba untuk mereplikasi masalah Anda dan saya tidak bisa
RobotHumans
Itu karena Anda tidak bekerja pada CIFS yang terpasang ;-). Saya lupa +1 untuk dicoba, terima kasih!
Boldewyn