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.

Jawaban:


267

Ah ah! Periksa komit sebelumnya, lalu periksa master.

git checkout HEAD^
git checkout -f master

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.