Git - Abaikan file selama penggabungan

115

Saya memiliki repo yang dipanggil myrepodi beanstalkserver jarak jauh .

Saya mengkloningnya ke komputer lokal saya. Membuat dua cabang tambahan: stagingdan dev. Mendorong cabang-cabang ini ke jarak jauh juga.

Sekarang:

 local                   remote                   server
 --------------------------------------------------------  
 master  ==> Pushes to  `master`  ==> deployed to `prod`
 staging ==> Pushes to  `staging` ==> deployed to `staging`
 dev     ==> Pushes to  `dev`     ==> deployed to `dev`

Saya memiliki file bernama config.xmlyang berbeda pada setiap cabang.

Saya ingin mengabaikan file ini hanya selama penggabungan. Tetapi saya ingin ini disertakan saat saya melakukan pembayaran atau melakukan dari / ke cabang repo.

Alasan saya menginginkan ini adalah, kami memiliki skrip penerapan yang menarik (checkout) cabang tertentu dan menerapkannya di server masing-masing. Jadi kami membutuhkan config.xmlfile dari cabang khusus itu masuk ke server tertentu seperti yang ditunjukkan di atas saat digunakan.

Saya kira .gitignoretidak akan berhasil. Apa pilihan lainnya? Perhatikan bahwa file yang diabaikan harus menjadi bagian dari checkout dan komit, yang penting. itu harus diabaikan hanya selama penggabungan.

Terima kasih!

Kevin Rave
sumber
Dalam mode defaultnya, git pull adalah singkatan dari git fetch diikuti oleh git merge FETCH_HEAD. Jadi pernyataan Anda agak bertentangan satu sama lain.
zzk
Yah, menurutku, pembayarannya. Tidak menarik. Saya akan memperbarui pertanyaan menjadi jelas.
Kevin Rave
2
apakah Anda pernah menemukan solusi untuk ini? Atribut git hanya berguna untuk kasus di mana file memiliki konflik antara cabang yang digabungkan, jadi itu tidak selalu cukup.
pvinis
apakah Anda melihat tautan simbolis (tidak diikuti oleh git) atau bahkan tautan keras untuk penyelamatan?
Frank Nocke

Jawaban:

94

Saya mengatasi masalah ini dengan menggunakan perintah git merge dengan --no-commitopsi dan kemudian secara eksplisit menghapus file bertahap dan mengabaikan perubahan pada file. Misalnya: katakan saya ingin mengabaikan perubahan apa pun untuk myfile.txtsaya lanjutkan sebagai berikut:

git merge --no-ff --no-commit <merge-branch>
git reset HEAD myfile.txt
git checkout -- myfile.txt
git commit -m "merged <merge-branch>"

Anda dapat menempatkan pernyataan 2 & 3 dalam loop for, jika Anda memiliki daftar file untuk dilewati.

unmesh-gurjar
sumber
2
Saya akan menambahkan "--no-ff" jika Anda ingin file tidak ditimpa saat penggabungan terjadi dalam strategi maju cepat.
Ilia Shakitko
1
jadi apa git reset HEAD myfile.txttepatnya yang dilakukannya? Bagaimana itu membantu tujuan kita di sini?
Kid_Learning_C
Bagaimana Anda menempatkan baris 2 dan 3 dalam satu lingkaran?
AndroidDev
52

Saya akhirnya menemukan git attributes. Mencoba. Bekerja sejauh ini. Belum memeriksa semua skenario. Tapi itu harus menjadi solusinya.

Gabungkan Strategi - Atribut Git

Kevin Rave
sumber
4
tetapi saya menemukan ini git-scm.com/book/ch7-2.html#Merge-Strategies
Nate-
1
Berikut ini tautan yang benar untuk bagian strategi penggabungan dokumen atribut git: git-scm.com/book/en/v2/…
Adrian Laurenzi
3
Menemukan ini dengan baik dijelaskan dalam sebuah artikel medium.com/@porteneuve/…
ShawnFeatherly
10
Ini sepertinya menjadi masalah jika tidak ada konflik? File masih akan digabungkan?
Brett
18

.gitattributes - adalah file tingkat root dari repositori Anda yang mendefinisikan atribut untuk subdirektori atau subset file.

Anda dapat menentukan atribut untuk memberi tahu Git agar menggunakan strategi penggabungan yang berbeda untuk file tertentu. Di sini, kami ingin melestarikan yang ada config.xmluntuk cabang kami. Kita perlu menyetel merge=ourske config.xmldalam .gitattributesfile.

merge=ours beri tahu git untuk menggunakan file (cabang saat ini) kami, jika konflik penggabungan terjadi.

  1. Tambahkan .gitattributesfile di tingkat root repositori

  2. Anda dapat mengatur atribut untuk confix.xml dalam .gitattributesfile

    config.xml merge=ours
    
  3. Dan kemudian tentukan strategi penggabungan dummy ours dengan:

    $ git config --global merge.ours.driver true
    

Jika Anda menggabungkan cabang stagformulir dev, alih-alih mengalami konflik gabungan dengan file config.xml, config.xml stag branch dipertahankan pada versi apa pun yang Anda miliki.

eigenharsha.dll
sumber
16
Tetapi bagaimana jika tidak ada konflik? Bagaimana cara menyimpan file tertentu selama penggabungan?
Igor Yalovoy
2
@IgorYalovoy: Jika tidak ada konflik ... yah, ini sedikit rumit karena sebenarnya bekerja dari ID hash, tetapi: jika config.xmlsama sekali tidak berubah dari basis gabungan ke versi ujung cabang, Git hanya mengambil versi yang diubah, tanpa melihat merge.ours.driverpengaturan. Jadi Anda benar untuk khawatir.
torek
1
salin-tempel dari Dokumen Git: Gabungkan Strategi - Atribut Git. Link
kyb
Metode ini menghasilkan "menggabungkan komitmen" setiap kali FYI.
rsmets
2
"milik kami" tampaknya menjadi nama yang sewenang-wenang untuk strategi baru yang diperkenalkan. Saya menemukan ini membingungkan, karena theirsmerupakan strategi penggabungan bawaan. Tapi tampaknya bahwa seseorang dapat menulis <pattern> merge=foo, kemudian git config --global merge.foo.driver true, dan akan bekerja dengan cara yang sama.
Kyle Strand
8

Anda bisa mulai dengan menggunakan git merge --no-commit, dan kemudian mengedit penggabungan sesuka Anda, yaitu dengan config.xmlmenghapus staging atau file lainnya, lalu komit. Saya curiga Anda ingin mengotomatiskannya lebih jauh setelah itu menggunakan kait, tetapi saya pikir itu layak dilakukan secara manual setidaknya sekali.

gcbenison.dll
sumber
2
Apakah git attributesmenawarkan solusi langsung? Saya tidak dapat memahami ini. git-scm.com/book/en/…
Kevin Rave
4

Anda bisa menggunakan .gitignoreuntuk menjaga config.xmlkeluar dari repositori, dan kemudian menggunakan hook komit posting untuk mengunggah config.xmlfile yang sesuai ke server.

tlehman
sumber
1
Saya tahu itu semacam peretasan. Saya mencoba mencari solusi yang bersih. Bagaimana dengan git attributes. Tahu cara kerjanya? Saya tidak dapat memahami ini. git-scm.com/book/en/…
Kevin Rave
1
Saya belum pernah mendengarnya, saya mencoba menerapkan atribut merge = ours, terlihat menjanjikan.
tlehman
1
Atribut Git luar biasa! Anda bahkan dapat memberi tahu git cara mendiffer file non-teks, sehingga Anda dapat menggunakan pdf2text untuk mengubah PDF!
tlehman
2

Contoh:

  1. Anda memiliki dua cabang: master,develop
  2. Anda membuat file di developcabang dan ingin mengabaikannya saat menggabungkan

Kode:

git config --global merge.ours.driver true
git checkout master
echo "path/file_to_ignore merge=ours" >> .gitattributes
git merge develop

Anda juga dapat mengabaikan file dengan ekstensi yang sama

misalnya semua file dengan .txtekstensi:

echo "*.txt merge=ours" >> .gitattributes
Sensei Tunggal
sumber
1

Di sini git-update-index - Daftarkan konten file di pohon kerja ke indeks.

git update-index --assume-unchanged <PATH_OF_THE_FILE>

Contoh:-

git update-index --assume-unchanged somelocation/pom.xml

Sireesh Yarlagadda
sumber
Itu bagus saat mendorong tetapi masih mengeluh saat menarik mungkin menimpa file.
Rolf
1
sudahkah Anda mencoba menambahkan entri file Anda dalam file .gitignore. @Rolf
Sireesh Yarlagadda