Google Copybara: Depolar Arasında Kod Taşıma
(github.com/google)- Copybara, Google içinde kullanılan bir araçtır; birden fazla depo arasında kaynak kodu dönüştürüp taşır ve confidential depolar ile public depoları senkronize etmek için kullanılır
- Tek bir doğruluk kaynağını korumak için bir depo yetkili depo olarak seçilir; ancak katkılar herhangi bir depodan kabul edilebilir ve sürümler de herhangi bir depodan oluşturulabilir
- Başlıca kullanım senaryosu tekrarlayan kod taşıma işlemleridir; confidential depodan public depoya belirli kodları aktarma ya da public depodaki değişiklikleri authoritative depoya alma akışlarını destekler
- Copybara, durumu ayrı bir sunucuda değil hedef deponun commit message label alanlarında tutan stateless bir yapı kullanır; böylece birden fazla kullanıcı veya servis aynı yapılandırma ve depolarla aynı sonucu elde edebilir
- Şu anda desteklenen depo türü Git'tir; Mercurial okuma desteği deneysel durumdadır ve genişletilebilir mimarisiyle özel origin ve destination bileşenleri eklenebilir
Copybara'nın çözdüğü sorun
- Copybara, depolar arasında kaynak kodu taşıma ve dönüştürme için kullanılan bir araçtır
- Kaynak kodunun birden fazla depoda bulunması gereken durumlar olabilir ve Copybara bu depolar arasında kodun dönüştürülmesini ve taşınmasını sağlar
- Temel örneklerden biri, confidential depo ile public depo arasında senkronizasyonu koruyan projelerdir
- En yaygın kullanım biçimi, kodu bir depodan diğerine tekrar tekrar taşımaktır
- Ayrıca kodu yeni bir depoya tek seferlik taşımak için de kullanılabilir
Yetkili depo ve katkı akışı
- Copybara, depolardan birinin authoritative repository olarak seçilmesini gerektirir
- Bu, her zaman tek bir source of truth bulunmasını sağlamak içindir
- Katkılar herhangi bir depodan yapılabilir
- Sürümler de herhangi bir depodan oluşturulabilir
- Yetkili olmayan depoda bir değişiklik olduğunda, Copybara bu değişikliği dönüştürüp yetkili depodaki uygun konuma taşıyabilir
- Buna bir örnek, public depodaki bir contributor tarafından yapılan değişikliktir
- Birleştirme çakışmaları, yetkili depoda eski değişiklikler işlenirken kullanılan yöntemle aynı şekilde ele alınır
Kullanım örnekleri
- Copybara kullanım örnekleri şunları içerir
- confidential depodaki kodun bir kısmını public depoya aktarmak
- public depodaki kodu confidential depoya aktarmak
- authoritative olmayan depodaki değişiklikleri authoritative depoya aktarmak
- Örnek yapılandırma,
core.workflowile origin ve destination tanımlar- origin olarak
git.github_originilehttps://github.com/google/copybara.gitiçindekimasterkullanılır - destination olarak
git.destinationilefile:///tmp/fookullanılır destination_files,third_party/copybara/**yolunu hedefler veREADME_INTERNAL.txthariç tutulurcore.replacevecore.move, BUILD dosyası yollarını değiştirmek ve dizin taşımak için kullanılır
- origin olarak
- Çalıştırma örneği, bare Git deposu oluşturduktan sonra
copybara copy.bara.skykomutunu çalıştırmaktır
Durum saklama yöntemi ve depo desteği
- Copybara'nın temel özelliklerinden biri stateless yapısıdır
- Daha doğru ifadeyle, durumu hedef depoda saklar
- Saklama yeri, commit mesajlarındaki label alanlarıdır
- Bu yöntem sayesinde birden fazla kullanıcı veya servis, aynı yapılandırma ve depo kombinasyonuyla aynı sonucu elde edebilir
- Şu anda desteklenen depo türü Git'tir
- Mercurial depolarından okuma mümkündür ancak hâlâ deneysel durumdadır
- Genişletilebilir mimari sayesinde neredeyse her kullanım senaryosuna uygun özel origin ve destination bileşenleri eklenebilir
- Diğer depo türleri için resmi destek ileride eklenecektir
Kurulum ve derleme
- Başlamanın en kolay yolu, önceden derlenmiş ikili dosyalar içeren haftalık snapshot release sürümünü kullanmaktır
- Sürümler otomatik olarak oluşturulur
- Manuel test, sürüm uyumluluğu veya doğruluk garantisi yoktur
- Sürümler
https://github.com/google/copybara/releasesadresinden seçilebilir
- Yayınlanmamış bir sürümü kullanmak için HEAD üzerinden derleme yapılmalıdır
- JDK 11 kurulumu gerekir
- Bazel kurulumu gerekir
- Kaynak kod
git clone https://github.com/google/copybara.gitile klonlanır bazel build //java/com/google/copybaraile derlenir- Çalıştırılabilir uberjar,
bazel build //java/com/google/copybara:copybara_deploy.jarile oluşturulur - Testler
bazel test //...ile çalıştırılabilir
- Bazı testler, Mercurial ve Quilt gibi temel araçların kurulu olmasını gerektirir
- Pull Request ilgili modüllerle bağlantılı değilse bu testler atlanabilir
- CI tüm testleri çalıştırır
- Arch Linux üzerinde
aur/copybara-gitpaketi kullanılabilir
Bazel'de önceden derlenmiş Copybara kullanımı
- Haftalık snapshot release, Bazel içinde kullanılabilir
- Copybara, class file version 65.0 ile sunulduğu için Java Runtime 21 veya üzeri ile çalıştırılmalıdır
- Bunun için
.bazelrciçinerun --java_runtime_version=remotejdk_21eklenmelidir
- Bunun için
- Release artifact,
http_jarile indirilirWORKSPACEiçindeload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")kullanılırMODULE.bazeliçindehttp_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")kullanılır
WORKSPACEveyaMODULE.bazeliçinde[version]yerine uygun değer yazılarakcopybara_deploy.jarbelirtilir- BUILD dosyasında
java_binarytanımlanır ve main class olarakcom.google.copybara.Mainkullanılır - Çalıştırma örneği:
bazel run //tools:copybara -- migrate copy.bara.sky
Harici Bazel deposu olarak kaynaktan derleme
- Copybara bağımlılıkları için kolaylık sağlayan makrolar sunulur
WORKSPACEiçinehttp_archiveeklenir ve{{ sha256sum }}ile{{ commit }}değerleri doldurulur- Ardından şu makrolar yüklenip çağrılır
copybara_repositories()copybara_maven_repositories()copybara_go_repositories()
- Workspace içinde
bazel run @com_github_google_copybara//java/com/google/copybara -- <args...>ile derlenip çalıştırılabilir
Docker kullanımı
- Copybara'yı Docker ile derleyip çalıştırma yöntemi şu anda deneyseldir
- Derleme,
docker build --rm -t copybara .ile yapılır - Çalıştırma, hedef kod kök dizininde
docker run -it -v "$(pwd)":/usr/src/app copybara helpbiçiminde yapılır - Container çalıştırma argümanları yerine ortam değişkenleri kullanılabilir
COPYBARA_SUBCOMMAND=migrate: çalıştırılacak komutu değiştirir, varsayılanmigrateCOPYBARA_CONFIG=copy.bara.sky: yapılandırma dosyası yolunu belirtir, varsayılan kök dizindekicopy.bara.skyCOPYBARA_WORKFLOW=default: çalıştırılacak workflow'u belirtir, varsayılandefaultCOPYBARA_SOURCEREF='': sourceref belirtir, varsayılan yokturCOPYBARA_OPTIONS='': Copybara seçeneklerini belirtir, varsayılan yoktur
- Git ayarları ve SSH kimlik bilgileri Docker container ile paylaşılabilir
- Örnekte
~/.gitconfig,~/.sshveSSH_AUTH_SOCKdeğerlerinin container içine mount edilmesi gösterilir
- Örnekte
Belgeler ve iletişim
- Belgeler hâlâ hazırlanma aşamasındadır
- Sunulan kaynaklar şunlardır
- Sorular için mailing list kullanılabilir
- Bazel test hatalarını log dosyasını
catile açmadan görmek için~/.bazelrciçinetest --test_output=streamedeklenebilir
1 yorum
Hacker News yorumları
Tam da oyun geliştirme stüdyomda kullanmak için yaptığım Perforce destek yamasını açık kaynak olarak yayımladıktan hemen sonra bu yazının çıkması ilginç oldu
Copybara’nın başlıca kullanımının dahili Google kod dağıtımı olduğunu ve bu kodun Perforce ile ilişkili Piper’da bulunduğunu düşününce, Perforce desteğinin olmaması ve yalnızca Git desteğinin anlamlı ölçüde bulunması oldukça şaşırtıcıydı
PR oluşturmadan önce Git geçmişine baktığımda çok sayıda Gerrit Change-ID işareti gördüm; bu yüzden bir yerlerde erişemediğim bir Gerrit kod inceleme sistemi olmasından ve PR’ımın upstream’e alınmamasından endişelendim
Perforce için Gerrit/Rietveld olmaması da üzücü, ama her şeyi bekleyemeyiz
https://github.com/google/copybara/pull/347
https://abseil.io/resources/swe-book/html/ch19.html
https://read.engineerscodex.com/p/how-google-takes-the-pain-...
Harici araçlar arasında Critique kadar iyi bir şey henüz bulamadım ve GitHub’ın zayıf PR inceleme aracının çoğu kişi tarafından kabul görmesi şaşırtıcı. Benzer seviyede bir araç bilen varsa duymak isterim
Birkaç yıl önce Google’dan ayrılırken oldukça titiz araştırmıştım; https://codeapprove.com/ en yakın olanıydı ama onda da hâlâ çok eksik vardı
Dahili monorepo’da yaşayan gVisor veya Bazel gibi açık kaynak projeler de küçük farklarla genelde benzer şekilde işletiliyor
Bu alandaki diğer ilginç araçlardan biri olarak Rust, commit senkronizasyonu için Josh adlı bir araç kullanıyor
https://josh-project.dev
Rust tarafında bir blog yazısı da var
https://blog.rust-lang.org/inside-rust/2026/06/04/how-josh-h...
Meta’da eskiden fbshipit adlı bir açık kaynak araç vardı, ancak herkese açık depoya göre artık kullanılmıyormuş
https://github.com/facebookarchive/fbshipit
Bu alanda başka araçlar da var mı?
Daha sonra Git’in kendisine merge edildi
https://manpages.debian.org/testing/git-man/git-subtree.1.en...
https://docs.github.com/en/get-started/using-git/about-git-s...
Birden fazla depo biraz kod paylaşmak istiyor ama bunu bir kütüphaneye ayırıp referans vermek, sürüm yayını çıkarmak ve bağımlı depoları güncellemek zahmetine değmiyorsa, bu araç o durumda da kullanışlı mı?
Örneğin ortak domain modelini içeren bir klasörü tek bir ana depodan diğer depolara basitçe senkronize etmek için kullanılıp kullanılamayacağını merak ediyorum
Go tarzı “çok fazla bağımlılık tutmaktansa biraz kopyalamak daha iyidir” felsefesine yakın bir kullanım
Bazı projeler monorepo’da geliştirilir ve Copybara ile dışarı aktarılır
Bizim ekip bunu dahili olarak Starlark kural setlerinin sürüm yönetimi için de kullanıyor
Herkese açık depoyu şirket içi özel deponun bağımlılığı yapmak geliştirme açısından epey baş ağrıtıcı. Bu tür bağımlılıklar ağaç gibi çoğalırsa gerçekten sorun olur
Uzun süredir kullanıyorum; çoğunlukla büyük bir projenin içinde yapılan bir araç, bağımsız yayımlanacak kadar büyüdüğünde kullanıyorum
Kodu dışa aktarıp geri içe almayı kapsayan çift yönlü dağıtımın tamamını yapacak kadar güçlü, ama bu iş çok zahmetli olduğu için tercih etmiyorum
Ben genelde özgün depodan bir klasörü ayırıp geçmişini koruyan basit, tek seferlik bir dışa aktarma için kullanıyorum. Sonraki geliştirme yeni depoya taşınıyor
Yeni proje yapısı tamamen farklı olsa bile
Git blameçalıştığı için memnunumÇift yönlü kullanım dağınık hâle geliyor; çünkü yol yeniden eşleme, dosya hariç tutma, başlıkları kaldırma gibi dönüşümler tek yönde kolay olsa da her zaman temiz biçimde tersine çevrilemiyor
İki taraf da ayrıştığında Copybara’nın temel çizgi takibi kafa karıştırıcı sonuçlar üretmeye başlıyor. Çünkü anlamsal olarak aynı commit bile dönüşümden sonra farklı SHA’lar oluşturuyor
Bilinmesi gereken nokta, geçmişi “korumanın” gerçek bir taşıma değil, yeniden yazılmış commit’leri cherry-pick etme yöntemi olduğudur. Dosya içeriği ve yazar bilgisi aktarıldığı için
Git blameçalışır, ancak SHA’lar yeniden oluşurCopybara özgün SHA’yı commit mesajı trailer’ı
GitOrigin-RevIdiçine koyar; bu da sonradan depolar arasındaki commit’leri karşılaştırmak gerektiğinde işe yarar52 yılı aşan bir ilerleme yani :-)
Temmuz 2026: Google copybara, iki üretim deposu arasında kod taşımayı mümkün kılıyor
Mart 1974: IBM COPY, iki üretim partitioned data set arasında kod taşımayı mümkün kılıyordu. OS/MVT ve OS/VS2 TSO Data Utilities COPY, FORMAT, LIST, MERGE User's Guide and Reference https://www.computinghistory.org.uk/downloads/8987
Dagster’da, herkese açık deponun daha büyük bir dahili monorepo içinde yaşayabilmesi için hub-and-spoke modeli kurarken Copybara kullandık; çalıştı ama epey dolambaçlı işlem gerektirdi
https://dagster.io/blog/monorepos-the-hub-and-spoke-model-an...
Hariç tutma ya da dönüştürme olmadan yalnızca depo senkronizasyonu gerekiyorsa, açıkçası kullanmazdım. Şimdilik uygun olabilir ama kaniko veya birçok Google ürünü/aracı gibi arşivlenir ya da sonlandırılırsa başınız derde girebilir
GitLab’da GitLab’dan GitHub’a ya da başka Git sağlayıcılarına/sunucularına mirror etmek için çok basit bir yöntem var
Örneğin harici
bzldosyalarını dahili BlazeBUILDuyumlu biçime dönüştürmek ya da harici import’lar ile dahilithird_partytarzı import’lar arasında dönüşüm yapmak gibiSaf bir mirror için Copybara fazla ağır kaçar
Güzel. Ben de yaklaşık 5 yıl önce iç içe Git depoları ve script’lerle benzer bir şey yapıp özel ve herkese açık depoları birlikte yönetme amacına ulaşmıştım
Shell script’im tabii ki Google ölçeğinde değildi
git subtreewrapper’ı olduğunu sanmıştım, ama bakınca çok daha fazla iş yaptığı anlaşılıyorÖrneğin senkronizasyon sırasında commit yazarı e-postasını değiştirme özelliği de var