Bagaimana cara menghapus file yang mengatakan "mode lama 100755 mode baru 100644" dari perubahan tidak bertahap di Git?

723

Untuk beberapa alasan, ketika saya awalnya melakukan penarikan dari repositori untuk proyek git milik saya, saya mendapat banyak file dalam copy pekerjaan saya yang tidak memiliki perubahan yang terlihat, tetapi tetap muncul di unstaged changesarea saya .

Saya menggunakan Git Gui di Windows xp, dan ketika saya pergi untuk melihat file untuk melihat apa yang telah berubah. Yang saya lihat adalah:

old mode 100755  
new mode 100644  

Adakah yang tahu apa artinya ini?

Bagaimana saya bisa mengeluarkan file-file ini dari daftar perubahan yang tidak dipentaskan? (Sangat menjengkelkan harus melalui 100-an file, hanya untuk memilih file yang baru-baru ini saya edit dan ingin komit).

concept47
sumber

Jawaban:

1286

Itu terlihat seperti mode izin file unix bagi saya ( 755= rwxr-xr-x, 644= rw-r--r--) - mode lama termasuk bendera + x (dapat dieksekusi), mode baru tidak.

Balasan msysgit masalah ini menyarankan pengaturan core.filemode menjadi false untuk menyingkirkan masalah:

git config core.filemode false
Amber
sumber
132
+1. Ini berarti bahwa git berpikir bahwa ia dapat mengatur bit yang dapat dieksekusi dengan benar pada file-file yang diperiksa, tetapi ketika ia mencoba untuk melakukannya bit tersebut tidak berfungsi (atau setidaknya tidak dengan cara yang dapat dibaca). Ketika kemudian membaca kembali status file-file itu sepertinya bit yang dapat dieksekusi sengaja tidak disetel. Pengaturan core.filemode ke false memberitahu git untuk mengabaikan perubahan bit yang dapat dieksekusi pada sistem file sehingga tidak akan melihat ini sebagai perubahan. Jika Anda perlu melakukan perubahan bit yang dapat dieksekusi, itu berarti Anda harus melakukannya secara manual git update-index --chmod=(+|-)x <path>.
CB Bailey
7
Jika, seperti saya, perubahan mode penting, Anda dapat mengatur core.filemode menjadi false, mengkomit perubahan kode aktual Anda, dan kemudian mengatur core.filemode menjadi true dan git akan mempertahankan perubahan file.
Michael T. Smith
8
Saya memiliki masalah yang sama, tetapi itu karena menggunakan repro git yang sama melalui SSH git cmd line, dan melalui Git Extensions pada drive yang dipetakan di Windows! . . Solusinya sama, ditambahkan ke "config" [core] filemode = false
Ian Vaughan
2
Itu penyelamat, terima kasih tuan! Ini terjadi pada saya di OSX, setelah saya berbagi repositori kloning pada folder publik dan mengubah izin untuk file.
Thiago Ganzarolli
8
@robsch Anda dapat menggunakan git config --global ...untuk mengatur opsi di file konfigurasi global Anda.
Amber
98

Pengaturan core.filemodeke false tidak berfungsi, tetapi pastikan pengaturan di ~/.gitconfigtidak ditimpa oleh pengaturan masuk .git/config.

NovelX
sumber
3
Pernah ke sana, melakukan itu. Sayangnya saya menemukan komentar Anda hanya setelah menyelesaikan masalah sendiri. Namun, +1!
David Schmitt
1
Jika pengguna lain mengkloning proyek ini pada Windows, mungkin yang terbaik adalah menerapkan perubahan pada ~/.gitconfigfile!
Ian Vaughan
Jika Anda ingin memeriksa Windows Powershell. git config --list --show-origin | sls filemodeatau di Linux git config --list --show-origin | grep filemode. Ini akan menunjukkan di mana Anda perlu melakukan penyesuaian.
Frank Fu
Kamu berhasil!! Sudah selesai dilakukan dengan baik.
Kim
27

Saya mengalami masalah ini ketika menyalin repo git dengan file yang berfungsi dari hard drive lama beberapa kali. Masalahnya berasal dari kenyataan bahwa pemilik dan izin berubah dari drive / mesin lama ke yang baru. Panjang dan pendeknya adalah, jalankan perintah berikut untuk meluruskan hal-hal ( berkat jawaban superuser ini ):

sudo chmod -R -x . # remove the executable bit from all files

Perintah sebelumnya sebenarnya akan menyelesaikan perbedaan yang dilaporkan git diff, tetapi akan mencabut kemampuan Anda untuk mendaftar direktori, jadi ls ./gagal ls: .: Permission denied. Untuk memperbaikinya:

sudo chmod -R +X . # add the executable bit only for directories

Berita buruknya adalah jika Anda memiliki file yang ingin tetap dapat dieksekusi, seperti .shskrip, Anda harus mengembalikannya. Anda dapat melakukannya dengan perintah berikut untuk setiap file:

chmod +x ./build.sh # where build.sh is the file you want to make executable again
Scott Willeke
sumber
2
Terima kasih, banyak membantu saya! Satu juga harus memeriksa yang git config core.filemodediatur ke true, jika tidak, perubahan izin tidak akan terdeteksi. Saya juga perlu menyegarkan indeks git setelah setiap perubahan untuk mengambilnya.
pat-s
Solusi ini adalah yang paling aman jika Anda khawatir tentang ketergantungan yang terpengaruh.
Jin
9

Biasanya terjadi ketika repo dikloning antara Windows dan Linux / mesin Unix.

Katakan saja git untuk mengabaikan perubahan filemode, berikut adalah beberapa cara:

  1. Konfigurasi HANYA untuk repo saat ini:

    git config core.filemode false
    
  2. Konfigurasi secara global:

    git config --global core.filemode false
    
  3. Tambahkan ~ / .gitconfig:

    [core]
         filemode = false
    

Pilih saja salah satunya.

K. Symbol
sumber
Konfigurasi global tidak berfungsi karena (saya kira) git membuat repo dengan opsi ini disetel ke true (Saya telah membuat repo di linux)
Herrgott
4

Tampaknya Anda telah mengubah beberapa izin direktori. Saya melakukan langkah-langkah berikut untuk mengembalikannya.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .
SuperNova
sumber
3

Anda bisa mencoba git reset --hard HEAD untuk mengatur ulang repo ke keadaan default yang diharapkan.

Serupa
sumber
8
Jika git tidak dapat mengatur bit yang dapat dieksekusi dengan benar / konsisten setelah menarik, itu tidak akan adil lebih baik setelah reset.
CB Bailey
2
Saya memindahkan beberapa proyek ke usb drive (fat32) dan kembali lagi ke mesin ubuntu saya (ext4) dan berakhir dengan banyak file yang berubah, well, atributnya. git reset --hard HEADbekerja dengan baik untuk saya. terima kasih
cirovladimir
7
-1. OP menyatakan "hanya untuk memilih file yang baru-baru ini saya edit dan ingin saya komit". Ini akan menghapus suntingan itu juga.
whitfin
9
-1 Menyarankan perintah ini di git mirip dengan mengatakan "Anda bisa saja rm -rf ./, saya yakin itu tidak akan memiliki konsekuensi yang tidak diinginkan".
Kzqai
1
Tidak, ini tidak membantu dan ini masalahnya. Anda mengatur ulang dan membersihkan dan status git masih menunjukkan perubahan mode. Ini adalah masalah serius dengan windows git dan saya pikir itu harus diperbaiki, tidak hanya bekerja dengan mengabaikan mode file.
vezenkov
2

Saya telah menghadapi masalah yang sama. Dan ini menyelamatkan hidup saya: https://gist.github.com/jtdp/5443498

git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never  \
| git apply`
bkm
sumber
1

Ini terjadi ketika Anda menarik dan semua file dieksekusi di repositori jarak jauh. Membuatnya dapat dieksekusi lagi akan membuat semuanya kembali normal lagi.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Anda mungkin perlu melakukan:

chmod -x <file> // Removes execute bit

sebagai gantinya, untuk file yang tidak ditetapkan sebagai yang dapat dieksekusi dan yang diubah karena operasi di atas. Ada cara yang lebih baik untuk melakukan ini tetapi ini hanyalah perbaikan yang sangat cepat dan kotor.

IskandarG
sumber
1

Anda dapat menggunakan perintah berikut untuk mengubah mode file Anda kembali. git add --chmod=+x -- filename Kemudian komit ke cabang.

Wae
sumber
0

Saya hanya punya satu file bermasalah dengan izin yang diubah. Untuk mengembalikannya satu per satu, saya hanya menghapusnya secara manual dengan rm <file>dan kemudian melakukan checkout untuk menarik salinan baru.

Untungnya saya belum menggelarnya.

Jika saya punya saya bisa berlari git reset -- <file>sebelum berlarigit checkout -- <file>

kEnobus
sumber
0

Saya baru saja mengalami masalah ini ketika membedakan cabang saya dengan master. Git mengembalikan satu kesalahan 'mode' ketika saya berharap cabang saya identik dengan master. Saya memperbaiki dengan menghapus file dan kemudian menggabungkan master lagi.

Pertama saya menjalankan diff:

git checkout my-branch
git diff master

Ini dikembalikan:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

Saya kemudian menjalankan yang berikut ini untuk memperbaikinya:

rm bin/script.sh
git merge -X theirs master

Setelah ini, git difftidak ada perbedaan antara cabang saya dan tuan.

Collin Krawll
sumber