Katakanlah saya berkolaborasi dengan seseorang melalui repositori git, dan ada file tertentu yang tidak ingin saya terima perubahan eksternal apa pun.
Adakah cara bagi saya untuk mengatur repo lokal saya agar tidak mengeluh tentang penggabungan yang berkonflik setiap kali saya melakukan git pull? Saya ingin selalu memilih versi lokal saya saat menggabungkan file ini.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
tag. Jika Anda hanya menginginkan perilaku ini untuk satu repo, tinggalkan--global
benderanya:echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Jawaban:
Pada contoh spesifik dari file konfigurasi, saya setuju dengan jawaban Ron :
konfigurasi harus "pribadi" ke ruang kerja Anda (karenanya "diabaikan", seperti dalam "dideklarasikan dalam
.gitignore
file").Anda mungkin memiliki template file konfigurasi dengan nilai tokenized di dalamnya, dan skrip yang mengubah
config.template
file itu menjadi file konfigurasi pribadi (dan diabaikan).Namun, pernyataan khusus itu tidak menjawab pertanyaan yang lebih luas yang lebih umum, yaitu pertanyaan Anda (!):
Penggabungan jenis ini adalah "penggabungan salinan", di mana Anda akan selalu menyalin versi 'milik kami' atau 'milik mereka' setiap kali ada konflik.
Untuk "file" (file secara umum, tidak berbicara tentang file "config", karena ini adalah contoh yang buruk), Anda akan melakukannya dengan skrip kustom yang dipanggil melalui penggabungan.
Git akan memanggil skrip tersebut karena Anda telah menentukan nilai gitattributes , yang mendefinisikan driver gabungan khusus .
Dalam hal ini, "custom merge driver" adalah skrip yang sangat sederhana yang pada dasarnya tidak akan mengubah versi saat ini, sehingga memungkinkan Anda untuk selalu memilih versi lokal Anda.
YAITU., Seperti dicatat oleh Ciro Santilli :
Mari kita uji dalam skenario sederhana, dengan msysgit 1.6.3 di Windows, hanya dalam sesi DOS:
Sekarang, mari buat dua file, yang keduanya akan memiliki konflik, tetapi akan digabungkan secara berbeda.
Kami akan memperkenalkan "konflik" pada konten kedua file tersebut di dua cabang git yang berbeda:
Sekarang, mari kita coba menggabungkan "hisBranch" ke "myBranch", dengan:
dirWithCopyMerge\b.txt
di mana aku selalu ingin menjaga saya versib.txt
.Karena penggabungan terjadi di '
MyBranch
', kami akan beralih kembali ke sana, dan menambahkangitattributes
arahan ' ' yang akan menyesuaikan perilaku penggabungan.Kami memiliki
.gitattributes
file yang ditentukan didirWithCopyMerge
direktori (hanya ditentukan di cabang tempat penggabungan akan terjadi :)myBranch
, dan kami memiliki.git\config
file yang sekarang berisi driver gabungan.Jika Anda belum mendefinisikan keepMine.sh, dan tetap meluncurkan penggabungan, inilah yang Anda dapatkan.
Ini baik saja:
a.txt
siap untuk digabungkan dan memiliki konflik di dalamnyab.txt
masih belum tersentuh, karena driver gabungan seharusnya menanganinya (karena arahan dalam.gitattributes
file di direktorinya).Tentukan
keepMine.sh
di mana saja di Anda%PATH%
(atau$PATH
untuk teman Unix kami. Saya melakukan keduanya tentu saja: Saya memiliki sesi Ubuntu dalam sesi VirtualBox)Seperti yang dikomentari oleh lrkwz , dan dijelaskan di bagian " Merge Strategies " dari Menyesuaikan Atribut Git - Git , Anda dapat mengganti skrip shell dengan perintah shell
true
.Namun dalam kasus umum, Anda dapat menentukan file skrip:
keepMine.sh
(yang satu driver penggabungan sederhana;) (Bahkan sederhana dalam kasus, penggunaan
true
)(Jika Anda ingin menjaga versi lainnya, cukup tambahkan sebelum
exit 0
baris:cp -f $3 $2
.Itu saja Anda menggabungkan pengemudi akan aways menjaga versi datang dari yang lain. cabang, menimpa perubahan lokal apa pun)
Sekarang, mari coba lagi penggabungan dari awal:
Penggabungan gagal ... hanya untuk a.txt .
Edit a.txt dan tinggalkan baris dari 'hisBranch', lalu:
Mari kita periksa bahwa b.txt telah dipertahankan selama penggabungan ini
Komit terakhir memang mewakili gabungan penuh :
(Garis yang dimulai dengan Gabung membuktikan itu)
Pertimbangkan bahwa Anda dapat menentukan, menggabungkan dan / atau menimpa driver gabungan, karena Git akan:
<dir>/.gitattributes
(yang ada di direktori yang sama dengan jalur yang dimaksud): akan berlaku atas yang lain.gitattributes
di direktori.gitattributes
(yang ada di direktori induk), hanya akan mengatur direktif jika belum diatur$GIT_DIR/info/attributes
. File ini digunakan untuk mengganti pengaturan dalam pohon. Ini akan menimpa<dir>/.gitattributes
arahan.Dengan "menggabungkan", yang saya maksud adalah "menggabungkan" beberapa driver gabungan.
Nick Green mencoba, di komentar , untuk benar-benar menggabungkan driver gabungan: lihat " Menggabungkan pom melalui driver git python ".
Namun, seperti yang disebutkan dalam pertanyaannya yang lain , ini hanya berfungsi jika terjadi konflik (modifikasi bersamaan di kedua cabang).
sumber
cp -f $3 $2
mungkin harus dikutip, yaitucp -f "$3" "$2"
.PATH
(Unix atau WindowsPATH
). Karena skrip itu akan ditafsirkan melalui shell bash Unix, atau melalui shell Windows MsysGit bash MingWin, itu akan menjadi portabel.Seperti yang dikomentari oleh @ ciro-santilli, cara sederhana untuk melakukannya dengan menggunakan
.gitattributes
pengaturannya:dan aktifkan strategi ini dengan:
(Saya menambahkan ini sebagai jawaban agar lebih terlihat tetapi menjadikannya Wiki Komunitas untuk tidak mencoba mendapatkan kredit pengguna di atas untuk diri saya sendiri. Harap beri suara positif pada komentarnya di bawah Q di sini untuk memberinya kudos!)
sumber
:-)
).Kami memiliki banyak file konfigurasi yang tidak ingin kami timpa. Namun .gitignore dan .gitattributes tidak berfungsi dalam situasi kami. Solusi kami adalah menyimpan file konfigurasi di cabang konfigurasi. Kemudian, izinkan file diubah selama git merge, tetapi segera setelah penggabungan, gunakan "git checkout branch -." untuk menyalin file konfigurasi kami dari cabang konfigurasi setelah setiap penggabungan. Jawaban stackoverflow mendetail di sini
sumber