Pertanyaan Bagaimana cara git-svn menangani akhiran garis?


Saya cukup senang dengan bagaimana Git sendiri menangani akhiran baris, via core.autocrlf, core.eol + gitattributes (Pos Tim sangat bagus).

Saya memiliki repositori Windows Git yang memiliki autocrlf mulai true. Jadi, semua file teks disimpan di repo sebagai LF dan tinggal di direktori kerja sebagai CRLF. Repo ini dikloning dari repo SVN, yang masih kami gunakan untuk mendorong dari / tarik ke (repo SVN adalah pusat kami, repo yang diberkati untuk memicu CI dll).

Tapi saya tidak tahu caranya git-svn menangani ujung garis selama operasi push / pull.

Adakah yang bisa menjelaskan apa git-svn Apakah dalam contoh ini?


32
2018-03-28 14:27


asal


Jawaban:


Saya tertarik dengan ini juga. Seandainya Anda memiliki repo yang dibuat melalui git svn clone, saya pikir Anda bisa memecahnya menjadi tiga pertanyaan yang berbeda:

  1. Apakah setiap git newline normalisasi / perubahan terjadi pada waktu pengambilan git svn, dalam pemindahan dari svn ke git repo?
  2. Apakah setiap git newline normalisasi / perubahan terjadi pada waktu commit git [mis. selama git lokal normal berkomitmen untuk repo dengan remote svn]? Bagaimana kalau menggabungkan / rebase waktu?
  3. Apakah setiap git newline normalisasi / perubahan terjadi pada waktu git svn dcommit, dalam mendorong / memutar / apa pun git yang dilakukan terhadap svn?

Saya ingin mendengar apa yang secara teoritis dianggap benar untuk pertanyaan-pertanyaan ini, tetapi untuk saat ini saya melakukan eksperimen kecil yang tampaknya menunjukkan bahwa tidak ada normalisasi newline dalam kasus # 1 setidaknya:

rem We'll make a svn repo with CRLF newlines, clone it into git with
rem autocrlf enabled, and try to see if that results in LF-only newlines
rem getting stored in the git repo

cd c:\code

rem Step 1. Prepare SVN repo with CRLF type newlines.
rem The pre-1.4 flag is to prevent an error during git clone.

svnadmin create --pre-1.4-compatible svnrepo
svn checkout file:///C:/code/svnrepo svnworking
cd svnworking
echo "First line" > file.txt
echo "Second line" >> file.txt
echo "Third line" >> file.txt
rem NOTE: At this point file.txt has CRLF newlines
svn add file.txt
svn commit -m "Add file.txt"
rem NOTE: At this point file.txt still has CRLF newlines
cd ..

rem Step 2. Clone the svn repo into git and inspect work copy newline type
git svn clone file:///C:/code/svnrepo gitrepo
rem The following outputs true on my machine
git config --get core.autocrlf
cd gitrepo
rem The following also outputs true on my machine
git config --get core.autocrlf
git svn fetch
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines

rem Step 3. Disable autocrlf to inspect repo's inner newline type
rem Use the following and my editor to set core.autocrlf to false:
git config --edit --local
rem This now prints false:
git config --get core.autocrlf
git checkout .
rem NOTE: At this point file.txt (git working dir copy) still has CRLF newlines
del file.txt
git checkout .
rem NOTE: Even after explicitly deleting the old one and checking out again,
rem file.txt still has CRLF newlines

Jika git baris baru konversi telah terjadi selama tarik git svn saya, sebaliknya, maka saya akan mengharapkan file.txt untuk memiliki baris baru LF-hanya pada akhir semua ini.

Berikut adalah pemeriksaan kewarasan bahwa langkah 3 di atas benar-benar menerapkan tes valid apakah repo memiliki baris baru LF-only:

rem We'll a git repo with core.autocrlf on, then switch it off to
rem pull out a file

rem The following outputs true
git config --get core.autocrlf
git init gitcrtest
cd gitcrtest
rem The following still outputs true
git config --get core.autocrlf
echo "First line" > file.txt
echo "Second line" >> file.txt
echo "Third line" >> file.txt
git add file.txt
git commit -m "Add file.txt"
rem NOTE: At this point file.txt (git working dir copy) has CRLF newlines
rem Use the following to set core.autocrlf to false
git config --edit --local
git checkout .
rem NOTE: Now file.txt (git working dir copy) has LF-only newlines

Singkatnya: Berdasarkan hal di atas, tampaknya ketika git-svn menarik dari svn, svn commit ditambahkan ke grafik git commit tanpa terjemahan crlf, bahkan ketika autocrlf diaktifkan. Artinya, apa pun jenis baris baru file Anda di repositori svn Anda, mereka juga akan memiliki klon git Anda. (Tapi git kamu copy pekerjaan mungkin memiliki jenis baris baru yang berbeda.)

Perhatikan bahwa ini cukup konsisten dengan diskusi tentang normalisasi akhir-line dalam "atribut bantuan git"; normalisasi ada yang disajikan sebagai sesuatu yang terjadi baik dengan perintah yang menarik barang dari repo ke direktori kerja Anda (misalnya checkout atau penggabungan) atau dengan perintah yang memindahkan sesuatu dari direktori kerja Anda ke indeks / repo (misalnya menambahkan atau melakukan). "Git svn fetch" tampaknya tidak melakukan salah satu dari hal-hal itu, jadi masuk akal bahwa tidak akan terjadi normalisasi akhir-akhir pada saat itu. Saya lebih bingung tentang apa yang dilakukan dcommit, jadi saya tidak yakin apakah mengharapkan normalisasi akhir-akhir pada saat itu.

Perhatikan ada kerutan tambahan jika properti SVN's svn: eol-style diatur pada repo / mesin Anda. saya berpikir default SVN adalah untuk tidak lakukan konversi akhir-baris pada akhirnya, tapi saya tidak 100% yakin.

Memperbarui: Untuk perspektif migrasi git dunia nyata pada baris baru, lihat juga Deskripsi Tim Abell daripadanya. CRLF newlines tidak diubah menjadi baris baru LF-only oleh git-svn, dengan hasil non-ideal jika normalisasi akhir-akhir git tetap. Solusi adalah untuk menormalkan akhiran garis dalam git atau untuk menonaktifkan akhir-garis-normalisasi.


15
2018-03-29 04:29