Git: salin semua file dalam direktori dari cabang lain

189

Bagaimana cara menyalin semua file dalam direktori dari cabang lain? Saya dapat membuat daftar semua file dalam direktori itu dengan melakukan

git ls-tree master:dirname

Saya kemudian dapat menyalin semua file secara individu dengan melakukan

git checkout master -- dirname/filename

Namun, menggunakan wildcard sejauh ini gagal total. Ini tidak melakukan apa-apa:

git checkout master -- dirname/*.png

Meskipun saya kira saya dapat menggunakan skrip bash untuk melakukan itu, harus ada cara yang lebih mudah, bukan?

alexenko
sumber

Jawaban:

289

Karena Anda tidak mencoba untuk memindahkan file-file di dalam pohon, Anda seharusnya dapat hanya checkout direktori:

git checkout master -- dirname
CB Bailey
sumber
2
Bagaimana jika saya ingin mempertahankan pesan komit untuk file yang disalin?
totels
2
@otel, sebenarnya tidak ada pesan komit yang terkait dengan file; pesan komit dikaitkan dengan objek komit itu sendiri. Ini yang saya duga Anda inginkan: di git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;mana $COMMIT_SHA1bisa seperti branch_adan akan menjadi objek komit yang memiliki pesan komit yang Anda inginkan. Saya tidak tahu bagaimana cara menentukan komit dengan perubahan terbaru kedirname
Alexander Bird
1
Ini memiliki efek samping yang sangat aneh. Ini salinan dirnameatas, tetapi juga salinan file yang berada di .gitignoresatu mastercabang. Adakah yang tahu mengapa itu terjadi?
Milimetrik
4
Efek samping lain saya pikir jika cabang saat ini memiliki file tambahan tidak dalam cabang yang Anda periksa (dalam folder target yang diberikan), pada dasarnya akan menggabungkan mereka bersama - mungkin ini hanya jika seseorang adalah leluhur? Saya tidak begitu yakin dengan kondisinya tetapi jika Anda memiliki 20 file di cabang A dan 20 file di cabang B dan hanya 10 di antaranya memiliki nama file yang sama, Anda berakhir dengan 30 file (setidaknya dalam kasus saya di mana cabang A adalah leluhur cabang B)
codercake
@totels periksa perintah git cherry-pick. Ini berlaku komit dari cabang lain, tetapi hanya file yang diubah dalam komit yang Anda inginkan.
cs01
18

Jika tidak ada spasi di jalur, dan Anda tertarik, seperti saya, hanya di file ekstensi tertentu, Anda dapat menggunakan

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')
test30
sumber
4
Sangat disayangkan bahwa git tidak mendukung fungsi ini secara langsung. Persis seperti OP, saya akan berpikir itu akan menjadi sepertigit checkout master -- *.c
Gregory Kuhn
1
Jawaban ini membantu saya menjawab, "Bagaimana saya bisa checkout file dari pola yang diberikan dari cabang lain ke cabang saya saat ini?"
usr-local-ΕΨΗΕΛΩΝ