File yang ditampilkan telah dimodifikasi secara langsung setelah klon Git

228

Saya mengalami masalah dengan repositori saat ini, dan meskipun Git-fu saya biasanya bagus, saya sepertinya tidak bisa menyelesaikan masalah ini.

Ketika saya mengkloning repositori ini, kemudian cdke repositori, git statusmenunjukkan beberapa file yang berubah. Catatan: Saya belum membuka repositori dalam editor apa pun atau apa pun.

Saya mencoba mengikuti panduan ini: http://help.github.com/dealing-with-lineendings/ , tetapi ini tidak membantu sama sekali dengan masalah saya.

Saya sudah mencoba git checkout -- .berkali-kali, tetapi sepertinya tidak melakukan apa-apa.

Saya menggunakan Mac, dan tidak ada submodul dalam repositori itu sendiri.

Sistem file adalah sistem file "Jurnal HFS +" pada Mac dan tidak peka huruf besar-kecil. File-file ini satu-baris dan masing-masing sekitar 79 KB (ya, Anda dengar benar), jadi melihat git diffitu tidak terlalu membantu. Saya telah mendengar tentang melakukan git config --global core.trustctime falseyang mungkin membantu, yang akan saya coba ketika saya kembali ke komputer dengan repositori di atasnya.

Saya mengubah detail sistem file dengan fakta! Dan saya mencoba git config --global core.trustctime falsetrik yang tidak berhasil dengan baik.

Sam Elliott
sumber

Jawaban:

142

Saya memiliki masalah yang sama pada Mac setelah kloning repositori. Itu akan menganggap semua file telah diubah.

Setelah berjalan git config --global core.autocrlf input, masih menandai semua file sebagai berubah. Setelah mencari perbaikan saya menemukan .gitattributesfile di direktori home yang memiliki yang berikut.

* text=auto

Saya berkomentar dan repositori kloning lainnya mulai sekarang berfungsi dengan baik.

adnans
sumber
5
Terima kasih! Saya akhirnya menemukan ini setelah menghabiskan sepanjang malam untuk beralih ke core.autocrlf dan mendaftar di ruang putih. Ini berhasil. Terima kasih.
xer0x
5
Baris yang menyinggung dalam .gitattributes datang dari dotfile Mathias Bynen , kalau-kalau ada orang lain yang menemukan ini.
SeanPONeil
31
adakah yang bisa menjelaskan lebih lanjut tentang konfigurasi khusus ini? Apa yang * text=autoharus dilakukan Apa artinya menghapusnya .gitattributes? Saya melihatnya memperbaiki masalah ini untuk saya, tetapi saya tidak yakin mengapa ia melakukannya, dan apa yang sebenarnya dilakukannya, dan masalah apa yang mungkin terjadi?
Dennis
6
@ Dennis Pengaturan ini membantu menormalkan akhir baris, jadi menghapusnya kemungkinan bukan jawaban yang tepat. Lihat pertanyaan ini 's jawaban dan artikel ini . @Arrowmaster jawaban di bawah ini lebih membantu saya. Saya menggunakan git adddan git commityang menormalkan file dan menyingkirkan masalah.
jtpereyda
4
git config --global core.autocrlf inputmemperbaikinya untukku. Terima kasih.
dimiguel
89

Saya mendapatkannya. Semua pengembang lain berada di Ubuntu (saya pikir) dan dengan demikian memiliki sistem file case-sensitive. Saya, bagaimanapun, tidak (karena saya di Mac). Memang, semua file memiliki huruf kecil kembar ketika saya melihatnya menggunakan git ls-tree HEAD <path>.

Saya akan meminta salah satu dari mereka untuk mengatasinya.

Sam Elliott
sumber
Apakah mereka pernah mengatasinya? Saya mungkin mengalami masalah yang sama.
Josh Johnson
8
Ya, suruh seseorang dengan sistem file case-sensitive untuk menghapus semua kecuali satu dari setiap set file yang akan memiliki duplikat nama file pada filesystem case-sensitive.
Sam Elliott
1
Baru saja mengalami masalah yang sama sejak pindah dari Ubuntu ke Mac. Terima kasih, jawaban Anda mengenai kepala. Berharap upvote mendorongnya ke posisi pertama. :-)
chmac
1
@ Simpang inilah sebabnya ada beberapa jawaban. Saya menerima salah satu yang diterapkan dalam kasus saya, yang tidak masuk akal.
Sam Elliott
1
Ini juga masalah saya - MacOS yang tidak sensitif. Namun git ls-tree HEAD <path>hanya menunjukkan satu file. Saya bisa melihat file duplikat di UI GitHub.com, dan juga menggunakan UI itu untuk menghapus satu versi.
orion elenzil
74
git config core.fileMode false

memecahkan masalah ini dalam kasus saya

https://git-scm.com/docs/git-config

TL; DR;

core.fileMode

Jika salah, perbedaan bit yang dapat dieksekusi antara indeks dan pohon kerja diabaikan; berguna pada sistem file yang rusak seperti FAT. Lihat git-update-index (1).

Default-nya benar, kecuali git-clone (1) atau git-init (1) akan menyelidiki dan menetapkan core.fileMode salah jika sesuai ketika repositori dibuat.

Piotr Korlaga
sumber
2
Tapi apa fungsinya ??
Siwel
1
Saya juga ingin tahu apa fungsinya, karena itu juga berhasil untuk saya.
Donato
2
Ketika saya melakukannya git diff, saya menemukan bahwa perubahan hanya dalam mode file. git mengambil chmod -R 777 .yang disebabkan ketika saya menjalankan proyek saya dan konfigurasi ini memungkinkan saya untuk mengabaikan perubahan chmod oleh git stackoverflow.com/q/1580596/6207775
Ayushya
1
Tautan rusak ( "Maaf, kami tidak dapat menemukan kernel Anda" ).
Peter Mortensen
Sisa jawaban tidak berhasil, namun ini memang ajaib!
Temui Patel
53

Saya berasumsi Anda menggunakan Windows. Halaman GitHub yang Anda tautkan memiliki detail mundur. Masalahnya adalah bahwa akhir baris CR + LF telah dikomit ke repositori dan karena Anda memiliki core.autocrlf yang disetel ke true atau input , Git ingin mengonversi akhiran baris ke LF, jadigit status menunjukkan bahwa setiap file diubah.

Jika ini adalah repositori yang hanya ingin Anda akses, tetapi tidak terlibat, Anda dapat menjalankan perintah berikut untuk hanya menyembunyikan masalah tanpa benar-benar menyelesaikannya.

git config core.autocrlf false

Jika ini adalah repositori yang Anda akan terlibat secara aktif dan dapat melakukan perubahan. Anda mungkin ingin memperbaiki masalah dengan membuat komit yang mengubah semua akhir baris dalam repositori untuk menggunakan LF alih-alih CR + LF dan kemudian mengambil langkah-langkah untuk mencegahnya terjadi lagi di masa mendatang.

Yang berikut ini diambil langsung dari halaman manual gitattributes dan harus dibentuk sebelumnya dari direktori kerja bersih.

echo "* text=auto" >>.gitattributes
rm .git/index     # Remove the index to force Git to
git reset         # re-scan the working directory.
git status        # Show files that will be normalized.
git add -u
git add .gitattributes
git commit -m "Introduce end-of-line normalization"

Jika ada file yang tidak dinormalisasi muncul di git status, hapus atribut teks mereka sebelum berjalan git add -u.

manual.pdf      -text

Sebaliknya, file teks yang tidak terdeteksi oleh Git dapat mengaktifkan normalisasi secara manual.

weirdchars.txt  text
Arrowmaster
sumber
8
Saya tidak menggunakan windows.
Sam Elliott
1
Secara default pada sistem non-Windows, core.autocrlf disetel ke false. Jadi Anda seharusnya tidak pernah mengalami masalah ini jika disebabkan oleh garis akhir. Bisakah Anda memberikan rincian lebih lanjut tentang pengaturan spesifik Anda seperti apa yang git diffmenunjukkan untuk file-file yang git statusmengatakan dimodifikasi, juga sistem file apa yang Anda gunakan?
Arrowmaster
memperbarui pertanyaan dengan jawaban untuk pertanyaan-pertanyaan ini. Akan melihat kembali semua detail dalam satu atau dua detik. Saya tidak yakin apa yang anggota tim dev lain gunakan
Sam Elliott
Inilah yang bekerja untuk kita ( git config core.autocrlf falsesudah cukup). Kami tertipu oleh kenyataan bahwa klien berjalan di Linux (SL / RHEL), tetapi sesi Linux dimulai melalui x2go dari host Windows. Jadi ini mungkin solusi yang paling mungkin dalam konteks homogen Win + Lin.
Dirk
37

Silakan jalankan perintah berikut. Itu mungkin bisa menyelesaikan masalah.

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard
kds
sumber
Tidak ada solusi lain yang bekerja untuk saya, tetapi yang ini membuat saya kembali dan berjalan.
rainabba
1
Saya mencoba yang ini dan itu berhasil untuk saya. Terima kasih tuan LIama!
Danniel Little
Ini membuat repositori saya lebih buruk. Pada cabang yang tidak memiliki perubahan, saya memiliki 277 setelah menjalankannya. Saya memiliki perubahan yang sama di cabang lain yang saya gunakan juga. Jalankan dengan hati-hati. Saya baru saja dikloning ulang oleh repo dan memiliki 615 file yang dimodifikasi. :(
Programmer Paul
ini bekerja untuk saya menggunakan git v2.7.4 dengan ubuntu (WSL), Git untuk Windows v2.18.0.windows.1 dan posh-git Saya selalu memiliki autocrlf false dan masalah dimulai pada Git untuk Windows dan posh-git setelah memutakhirkan ke 2.18.0 hari ini
Jim Frenette
Saya kagum ini berhasil. Terima kasih untuk bantuannya. Bagi yang lain menyusuri jalan ini, file-file yang tampaknya diubah adalah semua file .png dan .bmp dikelola oleh git LFS
David Casper
16

Di Visual Studio, jika Anda menggunakan Git, Anda dapat secara otomatis membuat file .gitignore dan .gitattributes. File .getattributes yang dibuat secara otomatis memiliki baris berikut:

* text=auto

Baris ini berada di dekat bagian atas file. Kami hanya perlu mengomentari baris dengan menambahkan # di depannya. Setelah melakukan itu, semuanya berjalan seperti yang diharapkan.

J Adam Rogers
sumber
1
Terima kasih, telah berjuang dengan ini untuk aaaages
Andrew Berry
Ini persis masalah saya. Pengembang lain telah menggunakan GIT melalui VS, bukan CLI dan membuat file .gitattributes ini.
Josh Maag
12

Masalahnya mungkin juga muncul dari izin file yang berbeda , seperti halnya kasus saya:

Repositori hasil kloning baru (Windows, Cygwin):

$ git ls-tree HEAD
100755 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑

Repositori jarak jauh kosong (Linux):

$ git ls-tree HEAD
100644 blob 8099ea496a2c78d71125d79a05855f60ebf07904    testfile
   ↑↑↑
Gima
sumber
5

Saya ingin menambahkan jawaban yang lebih terarah pada "Mengapa" ini terjadi, karena sudah ada jawaban yang bagus tentang cara memperbaikinya.

Jadi, .gitattributesmemiliki * text=autopengaturan, yang menyebabkan masalah ini.

Dalam kasus saya, file di cabang utama GitHub memiliki \r\nakhiran. Saya telah memutar pengaturan pada repositori untuk check-in dengan \nakhiran. Saya tidak tahu apa yang diperiksa Git. Seharusnya memeriksa dengan ujung asli ke kotak Linux saya ( \n), tapi saya kira itu memeriksa file dengan \r\nujung. Git mengeluh karena ia melihat \r\nakhiran yang diperiksa di repositori dan memperingatkan saya bahwa ia akan memeriksa \npengaturan. Karenanya file "harus dimodifikasi".

Itulah pengertian saya untuk saat ini.

Dennis
sumber
3

Saya memiliki masalah yang sama. Juga dengan Mac. Melihat repositori pada mesin Linux saya perhatikan bahwa saya memiliki dua file:

geoip.dat dan GeoIP.dat

Saya menghapus yang sudah usang pada mesin Linux dan mengkloning repositori lagi ke Mac. Saya tidak dapat menarik, melakukan, menyimpan atau menarik dari salinan repositori saya ketika ada duplikat.

pengguna2148301
sumber
3

Masalah yang sama bagi saya. Saya bisa melihat beberapa gambar dengan nama yang sama, seperti "textField.png" dan "textfield.png" di repositori Git jarak jauh, tetapi tidak pada repositori lokal saya. Saya hanya dapat melihat "textField.png" yang tidak digunakan dalam kode proyek.

Ternyata sebagian besar rekan saya ada di Ubuntu menggunakan sistem file ext4 sedangkan saya di Mac menggunakan APFS.

Berkat jawaban Sam Elliott , solusinya cukup sederhana. Pertama saya meminta seorang kolega di Ubuntu untuk menghapus versi file yang berlebihan dengan huruf besar, kemudian komit dan tekan pada remote.

Kemudian saya menjalankan yang berikut:

# Remove everything from the index.
git rm --cached -r .

# Write both the index and working directory from git's database.
git reset --hard

Akhirnya, kami memutuskan bahwa setiap pengembang harus mengubah konfigurasi Git-nya untuk mencegah hal ini terjadi lagi:

# Local Git configuration
git config core.ignorecase = true

atau

# Global Git configuration
git config --global core.ignorecase = true
Adrian
sumber
Akan lebih baik jika Anda hanya menjawabupvoted @ kds !
Elharony
Tampaknya perintah command-line tidak boleh memiliki tanda sama dengan ( =) karena akan berakhir di ignorecase = =dalam file konfigurasi.
Dmytro
1

Saya juga baru saja mengalami masalah yang sama. Dalam kasus saya, saya mengkloning repositori dan beberapa file segera hilang.

Ini disebabkan oleh path ke file dan nama file terlalu panjang untuk Windows. Untuk mengatasinya, klon repositori sedekat mungkin dengan root drive hard disk untuk mengurangi panjang jalur ke file. Misalnya, klon ke C:\A\GitRepobukan C:\Users Documents\yyy\Desktop\GitRepo.

8 bit
sumber
1

Edit file yang disebut .git/config:

sudo gedit .git/config

Atau:

sudo vim .git/config

Isi

[core]
    repositoryformatversion = 0
    filemode = false
    bare = false
    logallrefupdates = true

[remote "origin"]
    url = [email protected]:DigitalPlumbing/unicorn-magento.git
    fetch = +refs/heads/*:refs/remotes/origin/*

[branch "master"]
    remote = origin
    merge = refs/heads/master

[branch "productapproval"]
    remote = origin
    merge = refs/heads/productapproval

Ubah filemode=truemenjadi filemode = false.

Pramod Kharade
sumber
Ini setara dengangit config core.Filemode false
Guillermo Prandi
1

Untuk versi baru macOS ini dapat disebabkan oleh fitur keamanan OS.

Dalam repositori yang saya kerjakan, ada file biner yang memiliki * .app sebagai tipe file.

Itu hanya beberapa data serial, tetapi macOS memperlakukan semua file * .app sebagai aplikasi dan karena file ini tidak diunduh oleh pengguna, sistem menganggapnya tidak aman dan menambahkan com.apple.quarantineatribut file yang memastikan file tidak dapat dieksekusi.

Tetapi pengaturan atribut ini pada file juga mengubah file dan oleh karena itu muncul dalam set perubahan Git tanpa ada cara untuk mengembalikannya.

Anda dapat memeriksa apakah Anda memiliki masalah yang sama dengan menjalankan $ xattr file.app.

Solusinya cukup sederhana, selama Anda tidak harus bekerja dengan file tersebut. Tambahkan saja *.app binaryke .gitattributes.

Lukas Zech
sumber
0

Saya menyalin repositori lokal saya ke folder lain dan sekelompok file yang dimodifikasi muncul. Solusi saya adalah: Saya menyembunyikan file yang dimodifikasi dan menghapus simpanan . Repositori menjadi bersih.

Oleg Shvetsov
sumber
0

Saya menemukan bahwa Git memperlakukan file saya (.psd dalam kasus ini) sebagai teks. Mengaturnya ke tipe biner di .gitattributes menyelesaikannya.

*.psd binary
Lanny
sumber
0

Saya mencoba melakukan rebase interaktif, tetapi mengklaim ada beberapa file yang dimodifikasi, jadi tidak akan membiarkan saya melakukannya sekarang. Saya mencoba segalanya untuk kembali ke repositori bersih, tetapi tidak ada yang berhasil. Tidak ada jawaban lain yang membantu. Tapi ini akhirnya berhasil ...

git rm -rf the-folder-with-modified-stuff
git ci -m 'WAT'

Ledakan! Bersihkan repositori. Masalah terpecahkan. Kemudian saya hanya harus membuang komit terakhir ketika saya melakukan saya rebase -idan akhirnya semuanya bersih lagi. Aneh!

Thomas Aylott
sumber
0

Kalau-kalau itu membantu orang lain, mungkin ada penyebab lain untuk masalah ini: versi Git yang berbeda. Saya menggunakan versi default yang diinstal dari Git pada kotak Ubuntu 18.04 (Bionic Beaver) dan semuanya bekerja dengan baik, tetapi ketika mencoba untuk mengkloning repositori menggunakan Git pada Ubuntu 16.04, beberapa file muncul sebagai dimodifikasi.

Tidak ada jawaban lain di sini yang memperbaiki masalah saya, tetapi memutakhirkan versi Git agar sesuai dengan kedua sistem memang memperbaiki masalah.

Todd Chaffee
sumber
1
Akan sangat membantu (dan menarik) untuk mengetahui versi git mana yang tidak bermain bagus bersama.
jpaugh