Git: bir dizindeki tüm dosyaları başka bir şubeden kopyala


189

Bir dizindeki tüm dosyaları başka bir şubeden nasıl kopyalarım? Bu dizindeki tüm dosyaları yaparak listeleyebilirim

git ls-tree master:dirname

Sonra tüm dosyaları tek tek kopyalayabilirim.

git checkout master -- dirname/filename

Ancak, joker karakterler kullanmak tamamen başarısız oldu. Bu hiçbir şey yapmaz:

git checkout master -- dirname/*.png

Sanırım bunu yapmak için bir bash betiği kullanabilirim, daha kolay bir yol olmalı, değil mi?

Yanıtlar:


289

Dosyaları ağaçta hareket ettirmeye çalışmadığınızdan, dizine göz atmanız gerekir:

git checkout master -- dirname

2
Kopyalanan dosyalar için işlem mesajlarını saklamak istersem ne olur?
totels

2
@totels, kesinlikle konuşursak, dosyalarla ilişkili hiçbir kesin mesaj yoktur; tamamlama mesajı tamamlama nesnesinin kendisiyle ilişkilendirilir. İstediğinizi tahmin ediyorum: git checkout master -- dirname; git add dirname; git commit -c $COMMIT_SHA1 --reset-author;Nerede $COMMIT_SHA1olabilirsiniz branch_ave istediğiniz taahhüt mesajına sahip olan taahhüt nesnesi olabilir. En son değişiklik ile programlı olarak kararlılığı nasıl belirleyeceğimi bilmiyorumdirname
Alexander Bird

1
Bunun çok garip bir yan etkisi var. Bu kopyalar dirnameüzerinde, ama aynı zamanda kopya olan tüm dosyaları .gitignorearasında masterdalı. Bunun neden olduğu hakkında bir fikrin var mı?
Milimetrik

4
Başka bir yan etkisi Ben mevcut şube (belirli bir hedef klasörde) kontrol ettiğiniz dalda olmayan ek dosyaları varsa, temelde onları birleştirir - belki bu sadece bir ata ise? Koşullardan tam olarak emin değilim ancak A dalında 20 dosya ve B dalında 20 dosya varsa ve bunlardan sadece 10 tanesi aynı dosya adına sahipse, 30 dosyayla (en azından benim durumumda A (B dalının atasıdır)
Mart'ta codercake

@totels git komutunu kontrol edin cherry-pick. Diğer şubelerden gelen taahhütleri uygular, ancak yalnızca istediğiniz taahhütlerde değiştirilen dosyalar.
cs01

18

Yollarda boşluk yoksa ve benim gibi, yalnızca belirli bir uzantıdaki dosyalarla ilgileniyorsanız,

git checkout otherBranch -- $(git ls-tree --name-only -r otherBranch | egrep '*.java')

4
Git'in bu işlevi doğrudan desteklememesi üzücü. Tam olarak OP gibi, bunun gibi bir şey olacağını düşünürdümgit checkout master -- *.c
Gregory Kuhn

1
Bu yanıt, "Belirli bir desenin dosyalarını başka bir şubeden geçerli çalışan şubeme nasıl teslim alabilirim?"
usr-local-ΕΨΗΕΛΩΝ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.