Mengapa git tidak mengenali bahwa file saya telah diubah, oleh karena itu git add tidak berfungsi

100

Saya mencoba memasukkan file saya ke github menggunakan bash. Mereka sudah ada di sana, dan saya mengunggah versi yang lebih baru dengan baris dan kode baru, dll. Tetapi ketika saya mencoba git adddan kemudian git statusdikatakan:

Di master cabang

tidak ada yang perlu dilakukan, direktori kerja bersih

Dan file yang saya gunakan baru saja diubah.

somerandomguy
sumber
4
jika Anda telah berkomitmen, maka Anda tidak perlu melakukan apa-apa, periksa git log.
Grady Player
2
apa keluaran dari git diff?
maazza
2
@maazza Saya tidak mendapatkan apa-apa dari git diff
somerandomguy
1
Jika git diff(atau git status) tidak menampilkan apa pun yang menjelaskan mengapa tidak ada yang perlu ditambahkan. Jadi pertanyaannya sebenarnya: "Mengapa git tidak mengenali bahwa file saya telah diubah?"
Sunil D.
Maaf teman-teman, saya melihat apa yang terjadi. Git tidak melihat bahwa studio visual C # mengubahnya, tetapi ia melihat ketika sesuatu yang lain mengubahnya, seperti notepad ++
somerandomguy

Jawaban:

129

Saya mengalami masalah di mana sekali waktu saya mengatur indeks git ke 'asumsikan tidak berubah' pada file saya.

Anda dapat memberi tahu git untuk berhenti mengabaikan perubahan pada file dengan:

git update-index --no-assume-unchanged path/to/file

Jika itu tidak membantu pengaturan ulang mungkin cukup untuk kasus aneh lainnya.


Dalam praktiknya saya menemukan menghapus file yang di-cache dan mengatur ulang agar berfungsi:

git rm --cached path/to/file
git reset path/to/file

Cara git rm --cacheduntuk hanya menghapus file dari indeks, dan resetmemberi tahu git untuk memuat ulang indeks git dari komit terakhir.

ThorSummoner
sumber
18
git add -f path/to/the/fileitu akan secara paksa menambahkan file untuk komit.
San
2
Jawaban ini adalah satu-satunya yang membantu memperbaiki masalah saya. Tidak yakin apakah itu masalah Windows (saya tidak pernah mengalami masalah seperti ini di masa lalu, baik di osx atau linux). Terima kasih untuk @ThorSummoner. Btw, saya mencoba git add -ffile yang berada dalam status "asumsikan tidak berubah", dan tidak berhasil - harus salah satu git update-indexatau git rm --cacheddiikuti oleh a git resetuntuk membuatnya berfungsi.
rsenna
2
Juga, jika Anda benar-benar tidak yakin tentang status repo Anda saat ini, lakukan ini: git rm --cached -r .dan kemudian git reset ..
rsenna
Ada opsi lain untuk dicoba, git update-index --no-skip-worktree path/to/fileinilah cara saya memecahkan masalah saya
Fr0sT
1
Bekerja untuk saya, tapi ya hanya kasus file tunggal.
Thomas Cheng
24

Periksa .gitignorefile Anda . Anda mungkin menemukan bahwa file, atau ekstensi file, atau jalur ke file yang Anda coba kerjakan cocok dengan entri di .gitignoredalamnya, yang akan menjelaskan mengapa file itu diabaikan (dan tidak dikenali sebagai file yang diubah).

Ini ternyata menjadi kasus saya ketika saya memiliki masalah yang sama.

Marc Eliot Stein
sumber
1
Saya telah menggunakan gitignore.io untuk menghasilkan .gitignore saya dan saya telah menemukan baris dengan lib/, yang membuat git mengabaikan folder ini. Tidak ada masalah dengan itu - setidaknya jika folder ini bukan folder utama dari proyek Anda, seperti yang terjadi pada saya.
Paladini
Dan bagi siapa pun dalam kasus saya, itu sebenarnya
file pengecualian
Awalnya, ini tidak berhasil. Tapi, saya berhasil. Dalam kasus saya, hal yang harus diabaikan disebutkan dua kali di file gitignore. Selalu cari semua kejadian dan ganti semua.
MasterJoe
9

Seperti yang telah dibahas sebelumnya, file mungkin ditandai dengan "asumsi-tidak berubah", yang pada dasarnya memberitahu git bahwa Anda tidak akan memodifikasi file, jadi tidak perlu melacak perubahan dengannya. Namun ini dapat mempengaruhi banyak file, dan jika itu adalah ruang kerja yang besar, Anda mungkin tidak ingin memeriksa semuanya satu per satu. Jika demikian, Anda dapat mencoba: git update-index --really-refresh

menurut dokumen:

Like --refresh, but checks stat information unconditionally, without regard to the "assume unchanged" setting.

Ini pada dasarnya akan memaksa git untuk melacak perubahan semua file terlepas dari flag "asumsikan-tidak berubah".

André Cunha
sumber
2
Bagi saya git statusmengatakan tidak ada file yang diubah, tetapi git add .menambahkan dua file, dan git update-index --really-refreshmengatakan keduanya membutuhkan pembaruan, tetapi sepertinya tidak melakukan apa-apa. Ada ide?
someonewithpc
2
Status git mengabaikan file dengan flag anggap tidak berubah. Namun menggunakan git update-index --really-refresh akan menghapus tanda itu dan file sekarang akan muncul. Coba jalankan status git lagi untuk melihat apakah sekarang mengubah perubahan. Jika Anda tidak melihat apa pun, ikuti posting ini: stackoverflow.com/questions/2363197/… terutama perintah untuk menampilkan daftar file yang memiliki asumsi-nochanges: git ls-files -v | grep '^[[:lower:]]'Jika tidak ada yang membantu, Anda harus membuat pertanyaan dengan detail lebih lanjut sehingga kami dapat membantu kamu.
André Cunha
8

Kedengarannya gila, tapi terkadang Anda tidak berada dalam repo yang benar meskipun Anda mengira Anda benar. Misalnya, Anda mungkin telah memindahkan direktori induk, tetapi lupa untuk mengganti repo di editor teks Anda. Atau sebaliknya: Anda berada di repo yang benar di editor teks tetapi repo yang salah di baris perintah. Dalam situasi pertama, Anda melakukan pengeditan di file yang benar tetapi itu bukan folder yang sama yang terbuka di baris perintah Anda, jadi sebenarnya itu adalah file yang salah. Dalam situasi kedua, Anda sebenarnya mengedit file yang benar, tetapi baris perintah Anda git tidak akan mengenali perubahan tersebut karena Anda tidak berada di direktori yang benar pada baris perintah.

Monroe Mann
sumber
7

baik kami tidak memiliki cukup untuk menjawab pertanyaan ini jadi saya akan memberi Anda beberapa tebakan:

1) Anda menyimpan perubahan Anda, untuk memperbaiki jenis: git stash pop

2) Anda memiliki perubahan dan Anda berkomitmen, Anda harus dapat melihat komitmen Anda git log

3) Anda memiliki perubahan melakukan beberapa jenis git reset --hardatau lainnya, perubahan Anda mungkin ada di reflog, ketik git reflog --alldiikuti dengan memeriksa atau memilih ceri ref jika Anda pernah menemukannya.

4) Anda telah memeriksa repo yang sama beberapa kali, dan Anda salah.

Pemain Grady
sumber
1) tidak ada simpanan yang ditemukan 2) Saya telah mengubah dan berkomitmen, jadi dapatkah saya berkomitmen lagi? 3) Saya tidak melakukan itu 4) Saya berada di repo yang benar
somerandomguy
jika Anda memiliki perubahan dan melakukan perubahan, maka Anda dapat melanjutkan ke langkah berikutnya, mendorong atau apapun alur kerja Anda ... Anda dapat berkomitmen lagi jika Anda memiliki lebih banyak perubahan, Anda bahkan dapat git commit --amendmemasukkan perubahan baru Anda ke dalam pengubahan terakhir , jangan lakukan itu jika Anda telah membagikan komit Anda.
Grady Player
Menutup dan membuka kembali terminal melakukannya untuk saya setelah membersihkan repo proyek.
Eddie
4

Apakah hal yang funky seperti ini terjadi. Plugin git Eclipse Kepler secara otomatis menandai semua folder proyek saya sebagai diabaikan di folder .gitignore.

Ketika saya sampai commitdi Teammenu, mereka semua akan kembali untuk diabaikan. Sejauh yang saya tahu, ini karena saya menetapkannya sebagai turunan dalam proyek induk. Menghapus tanda mereka sebagai telah derviedmemperbaiki ini. Saya belum pernah melihat ini sebelumnya di Indigo. Semoga bisa membantu seseorang.

Joseph Lust
sumber
Adakah ide bagaimana masalah ini dapat diperbaiki ketika terjadi di intellij?
MasterJoe
3

TL; DR; Apakah Anda berada di repositori yang benar?

Ceritaku agak lucu tapi kupikir itu bisa terjadi dengan seseorang yang mungkin memiliki skenario serupa jadi bagikan di sini.

Sebenarnya di komputer saya, saya memiliki dua repositori git terpisah repo1dan repo2dikonfigurasi dalam direktori root yang sama bernama source. Kedua repositori ini pada dasarnya adalah repositori dari dua produk yang saya kerjakan di perusahaan saya. Sekarang masalahnya adalah bahwa sebagai pedoman standar, struktur direktori kode sumber dari semua produk persis sama di perusahaan saya.

Jadi tanpa sadar saya memodifikasi file dengan nama yang sama persis dengan repo2yang seharusnya saya ubah repo1. Jadi, saya hanya terus menjalankan perintah git statusdi repo1dan itu terus memberikan pesan yang sama

Di master cabang

tidak ada yang perlu dilakukan, direktori kerja bersih

selama setengah jam. Kemudian kolega saya mengamatinya sebagai sepasang mata independen dan membawa hal ini kepada saya bahwa saya berada di tempat penyimpanan yang salah tetapi terlihat sangat mirip. Saat saya beralih ke repo1Git mulai memperhatikan file yang diubah.

Kasus yang tidak begitu umum. Tapi kamu tidak pernah tahu!

NSP
sumber
3

Kami telah mengalami ini di Windows saat mengubah file dengan mentransfer perbedaan melalui alat WinMerge. Rupanya WinMerge (setidaknya cara itu dikonfigurasi di komputer saya) terkadang tidak memperbarui stempel waktu file yang diubahnya.

Di Windows, status git , menggunakan, antara lain, stempel waktu file dan perubahan ukuran file untuk menentukan apakah file telah berubah atau tidak. Jadi karena cap waktu tidak diperbarui, itu hanya ukuran file yang harus dilalui. Sayangnya file yang dimaksud adalah file versi sederhana dimana isinya diubah dari 7.1.2 menjadi 7.2.0 . Dengan kata lain, ukuran file juga tidak berubah. File lain yang juga diubah oleh WinMerge dan stempel waktunya tidak diperbarui tetapi memiliki ukuran berbeda setelah perubahan terdeteksi oleh status git dengan baik.

antred
sumber
3

Saya mengalami masalah serupa saat menggunakan Sublime Text-3 . Setelah membuat perubahan baru pada kode dan menyimpannya, ketika saya mencoba perintah git add ./status responnya adalah "cabang sudah up to date". Saya tahu, terlepas dari menyimpan pembaruan di editor teks, file tersebut sebenarnya tidak berubah. Membuka file di editor lain dan menyimpan perubahan berhasil untuk saya.

Balraj Gill
sumber
Ini juga terjadi pada saya
Kloar
2

Apakah Anda memindahkan direktori keluar dari bawah cangkang Anda? Ini dapat terjadi jika Anda memulihkan proyek dari cadangan. Untuk mengatasinya, cukup cdkeluar dan masuk kembali:

cd ../
cd -
SilverWolf - Kembalikan Monica
sumber
Wow, memang begitu. Gila. Trik lain tidak berhasil sama sekali!
Makalele
1

Secara umum dengan masalah ini, pertama-tama periksa apakah Anda sedang mengedit file yang menurut Anda memang benar! Saya mengalami masalah ini ketika saya mengedit file JavaScript yang transparan daripada file sumber (versi transpiled tidak berada di bawah kendali sumber).

Chris Halcrow
sumber
terima kasih telah menyebutkan ini! Saya sangat yakin bahwa saya memperbarui file yang benar. Nggak. face palm
Ashley Grenon
1

Klien Git saya (Gitg) menyebabkan masalah ini bagi saya. Perintah normal yang biasanya saya jalankan tidak berfungsi. Bahkan menyentuh setiap file dalam proyek tidak berhasil.

Saya menemukan cara untuk memperbaikinya dan saya masih tidak yakin apa penyebabnya. Salin direktori proyek Anda. File yang hilang akan muncul di direktori yang disalin git status. Mengganti nama mungkin melakukan hal yang sama.

kagronick
sumber
1

Mengalami masalah, tetapi itu hanya dua direktori dan tidak saya ketahui adalah bahwa kedua direktori tersebut akhirnya dikonfigurasi sebagai git submodul. Bagaimana itu terjadi Saya tidak tahu, tetapi prosesnya adalah mengikuti beberapa instruksi pada tautan ini, tetapi TIDAK menghapus direktori (seperti yang dia lakukan di akhir) melainkan lakukangit add path/to/dir

Andrew Lank
sumber
1

Saat Anda mengedit file di Visual Studio, file tersebut akan terdaftar dalam perubahan git secara instan meskipun file tersebut tidak disimpan. Jadi yang perlu Anda lakukan hanyalah menyimpan file secara manual (Ctrl + S untuk file yang sedang ditampilkan atau Ctrl + Shift + S untuk semua file proyek) dan git bash akan mengambilnya.

yaugenka
sumber
Ini bekerja untuk saya saat menambahkan komentar ke .jsfile, bekerja dengan Visual Studio Code. Terima kasih.
SnuKies
0

Jenis file apa yang Anda coba unggah? Sekarang saya hanya menghabiskan waktu hampir satu jam untuk mengupload modifikasi css saya. Tetapi css ini dikompilasi dari file styl oleh karena itu git mengabaikannya. Ketika saya mengubah sumber gaya maka semuanya bekerja.

Semoga membantu.

Paxi
sumber
0

Terkadang tergantung dan menurut versi git dan jika Anda lupa melakukannya git add ..

Untuk memeriksa tentang perubahan Anda pada repositori, gunakan selalu git statusyang menampilkan semua file yang tidak terlacak dan diubah. Karena git diffhanya menampilkan file yang ditambahkan.

onalbi
sumber
0

Pastikan untuk tidak membuat symlink ( ln -s source dest) dari dalam Git Bash untuk Windows.

Itu TIDAK membuat symlink, tetapi melakukan salinan dalam dari sumber ke tujuan

Saya mengalami perilaku yang sama seperti OP di terminal MINGW64 dari Git Bash untuk Windows (versi 2.16.2) untuk menyadari bahwa perubahan 'yang diedit' saya sebenarnya ada di direktori asli, dan perintah git bash saya berasal dari dalam salinan dalam yang tersisa tidak berubah.

StevenWernerCS
sumber
0

Saya memiliki masalah yang sama. Ternyata saya memiliki dua salinan proyek dan terminal saya berada di folder proyek yang salah!

zar
sumber
0

Itu terjadi pada saya juga, saya mencoba metode yang disebutkan di atas dan tidak ada yang membantu. Maka solusinya adalah mengubah file melalui terminal, bukan GUI. Saya tidak tahu mengapa ini berhasil tetapi berhasil. Setelah saya mengedit file melalui nano dari terminal git mengenalinya sebagai diubah dan saya bisa menambahkannya dan melakukan.

Zed895
sumber
Sudahkah Anda menemukan solusi untuk ini? Saya telah berjuang dengan git saya yang tidak mengenali file saya yang diubah ketika saya menggunakan alat penggabungan apa pun, dan satu-satunya cara agar git melihat perubahan adalah dengan menggunakan nano untuk penggabungan saya, yang membutuhkan lebih banyak waktu. File yang konflik awalnya terlihat oleh git, setelah mereka diedit oleh alat gabungan mereka muncul sebagai "tidak berubah" di git.
Lucas P.
saya tidak tahu mengapa ini berhasil dan bagaimana ini bekerja tetapi berhasil untuk saya terima kasih
Amit Bisht
0

Saya memiliki masalah yang sama di sini VS2015 tidak mengenali perubahan file js saya, menghapus remote dari pengaturan repositori dan kemudian menambahkan kembali jalur URL jarak jauh memecahkan masalah saya.

Muzafar Hasan
sumber
0

Saya memiliki masalah serupa ketika saya membuat file patch di server dengan editor vi. Sepertinya masalahnya ada pada jarak. Ketika saya mendorong patch dari lokal, penerapannya tepat.

Pkrishna
sumber
-1

Saya punya masalah ini. Milik saya tidak berfungsi karena saya meletakkan file saya di folder .git di dalam proyek saya.

Lafsnb
sumber
-2

Dalam kasus saya, melakukan git reset --hardfile yang dihapus & meninggalkan beberapa folder kosong. Setelah memeriksa konten, saya melihat direktori tersebut kosong.

Namun git mengabaikan folder kosong. (Koreksi, git mengabaikan semua direktori saat melacak konten, folder kosong bukanlah konten.)

tempat sampah
sumber
-4

mencoba untuk menggunakan git add * kemudiangit commit

Tih Haur
sumber
1
Selamat datang di SO! Ini sepertinya tidak menjawab pertanyaannya, dan sudah ada 9 jawaban di sini. Harap alihkan upaya Anda ke pertanyaan yang perlu dijawab!
Cris Luengo