Bagaimana cara memaksa git untuk memeriksa cabang master dan menghapus carriage return setelah saya menormalkan file menggunakan atribut “text”?

104

Oke, jadi saya menambahkan file .gitattributesdengan baris seperti ini

*.css text
*.js text
etc...

Saya kemudian mengikuti instruksi di http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

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

Tapi sekarang copy pekerjaan saya masih memiliki kereta kembali! Saya memiliki file yang belum terlacak yang ingin saya simpan. Bagaimana saya memiliki git checkout cabang master lagi dengan file yang dinormalisasi?

Saya tahu file-file tersebut dinormalisasi dalam repositori karena ketika saya mengkloning repo, saya memiliki semua file tanpa carriage return.

Jason
sumber

Jawaban:

267

Ah ah! Periksa komit sebelumnya, lalu periksa master.

git checkout HEAD^
git checkout -f master
Jason
sumber
5
Terima kasih atas solusi ini, tetapi ini adalah masalah mencolok di git bahwa "checkout -f" tidak benar-benar memaksa pembayaran ulang. Masalah lain adalah menghapus semua file copy pekerjaan terlebih dahulu (yaitu semuanya kecuali .git dir).
pfalcon
Ah, ya, terima kasih untuk itu! Mendengar itu, saya kira kita bisa menghapus file yang menarik dan menjalankan pembayaran. Bagi saya sebenarnya hanya ada satu file yang saya coba perbaiki. Tapi tentu saja itu mungkin semua file, ratusan, atau ribuan.
Jason
Ini gagal pada git 1.8.3 (mac) dengan: error: pathspec 'HEAD ^' tidak cocok dengan file yang dikenal dengan git.
dval
@dval, lihat hasil edit posting ini dan Anda akan melihat cara alternatif untuk melakukan ini. Saya menggunakan Mac juga, dan ini berhasil untuk saya. Saya juga mendorong Anda untuk meningkatkan git Anda ke 2+ dan Anda dapat menggunakan Homebrew untuk melakukan ini dengan cara yang aman dan dapat dipelihara.
Jason
2
Ini tidak benar-benar berhasil. GIT hanya akan memperbarui file yang diubah di antara dua komit (dengan beberapa pengecualian). Jika repositori baru, mis. hanya dua komit dan yang pertama kosong, maka solusi ini akan berhasil. Jika tidak, Anda perlu menghapus semua file secara paksa seperti yang dijelaskan oleh jawaban mechsin.
jstine
16

Seperti yang ditunjukkan orang lain, seseorang bisa saja menghapus semua file di repo dan kemudian memeriksanya. Saya lebih suka metode ini dan dapat dilakukan dengan kode di bawah ini

git ls-files -z | xargs -0 rm
git checkout -- .

atau satu baris

git ls-files -z | xargs -0 rm ; git checkout -- .

Saya menggunakannya sepanjang waktu dan belum menemukan sisi negatifnya!

Untuk penjelasan lebih lanjut, -zmenambahkan karakter nol ke akhir setiap keluaran entri ls-files, dan -0memberitahu xargsuntuk membatasi keluaran yang diterima oleh karakter nol tersebut.

mechsin.dll
sumber