Google Copybara: रिपॉजिटरीज़ के बीच कोड मूव करना
(github.com/google)- Copybara Google के भीतर इस्तेमाल होने वाला एक टूल है, जो कई repositories के बीच source code को transform और move करके confidential repository और public repository को sync रखने जैसे मामलों में उपयोग होता है
- एक repository को authoritative repository के रूप में चुनकर single source of truth बनाए रखा जाता है, लेकिन contribution किसी भी repository से लिया जा सकता है और release भी किसी भी repository से बनाया जा सकता है
- इसका मुख्य use case बार-बार code move करना है, और यह confidential repository से public repository में कुछ code लाने या public repository के बदलाव authoritative repository में लाने वाले flow को support करता है
- Copybara state को अलग server में नहीं, बल्कि target repository के commit message labels में store करने वाले stateless तरीके का उपयोग करता है, इसलिए कई user या service एक ही config और repository पर समान result प्राप्त कर सकते हैं
- अभी समर्थित repository type Git है, जबकि Mercurial read experimental feature है, और इसकी extensible संरचना के कारण custom origin और destination जोड़े जा सकते हैं
Copybara किस समस्या को हल करता है
- Copybara repositories के बीच source code को move और transform करने का एक टूल है
- कई बार source code को कई repositories में मौजूद रहना पड़ता है, और Copybara ऐसे repositories के बीच code को transform और move करने देता है
- इसका प्रमुख उदाहरण confidential repository और public repository को sync करके बनाए रखने वाले project हैं
- इसका सबसे आम उपयोग एक repository से दूसरी repository में code को बार-बार ले जाना है
- इसे code को किसी नई repository में सिर्फ एक बार migrate करने के लिए भी इस्तेमाल किया जा सकता है
Authoritative repository और contribution flow
- Copybara में repositories में से एक को authoritative repository के रूप में चुनना जरूरी है
- यह सुनिश्चित करने के लिए कि हमेशा एक source of truth मौजूद रहे
- contribution किसी भी repository में किया जा सकता है
- release भी किसी भी repository से बनाया जा सकता है
- अगर non-authoritative repository में बदलाव होता है, तो Copybara उस बदलाव को transform करके authoritative repository के सही स्थान पर ले जा सकता है
- उदाहरण के तौर पर, public repository के contributor द्वारा किया गया बदलाव
- merge conflict को authoritative repository के भीतर पुराने बदलावों को संभालने के समान तरीके से deal किया जाता है
उपयोग के उदाहरण
- Copybara के उपयोग के उदाहरणों में शामिल हैं
- confidential repository के code का कुछ हिस्सा public repository में लाना
- public repository के code को confidential repository में लाना
- non-authoritative repository के बदलाव authoritative repository में लाना
- example config
core.workflowके जरिए origin और destination को define करता है- origin
git.github_originके साथhttps://github.com/google/copybara.gitकीmasterbranch का उपयोग करता है - destination
git.destinationके साथfile:///tmp/fooका उपयोग करता है destination_filesमेंthird_party/copybara/**को target किया जाता है औरREADME_INTERNAL.txtको exclude किया जाता हैcore.replaceऔरcore.moveके जरिए BUILD file path replace और directory move किया जाता है
- origin
- execution example में bare Git repository बनाने के बाद
copybara copy.bara.skyचलाया जाता है
State storage का तरीका और repository support
- Copybara की प्रमुख विशेषताओं में से एक इसकी stateless संरचना है
- अधिक सटीक रूप से कहें तो यह state को target repository में store करता है
- storage location commit message का label होता है
- इस तरीके से कई user या service एक ही config और repository combination के साथ समान result प्राप्त कर सकते हैं
- वर्तमान में समर्थित repository type Git है
- Mercurial repository से read करना संभव है, लेकिन अभी experimental है
- extensible architecture के जरिए लगभग हर use case के लिए bespoke origin और destination जोड़े जा सकते हैं
- अन्य repository types के लिए official support भविष्य में जोड़ा जाएगा
Installation और build
- शुरू करने का सबसे आसान तरीका prebuilt binaries वाली साप्ताहिक snapshot release का उपयोग करना है
- releases अपने-आप बनाई जाती हैं
- manual testing, version compatibility, या correctness की कोई guarantee नहीं है
- release को
https://github.com/google/copybara/releasesसे चुना जा सकता है
- unreleased version इस्तेमाल करने के लिए HEAD से build करना होगा
- JDK 11 install होना चाहिए
- Bazel install होना चाहिए
git clone https://github.com/google/copybara.gitसे source clone करेंbazel build //java/com/google/copybaraसे build करें- executable uberjar
bazel build //java/com/google/copybara:copybara_deploy.jarसे बनता है - test
bazel test //...से चलाए जा सकते हैं
- कुछ tests के लिए Mercurial, Quilt जैसे underlying tools install होने चाहिए
- अगर Pull Request उन modules से संबंधित नहीं है, तो वे tests skip किए जा सकते हैं
- CI सभी tests चलाता है
- Arch Linux पर
aur/copybara-gitpackage का उपयोग किया जा सकता है
Bazel में prebuilt Copybara का उपयोग
- साप्ताहिक snapshot release को Bazel में इस्तेमाल किया जा सकता है
- Copybara class file version 65.0 के साथ दिया जाता है, इसलिए इसे चलाने के लिए Java Runtime 21 या उससे ऊपर चाहिए
.bazelrcमेंrun --java_runtime_version=remotejdk_21जोड़ना होगा
http_jarके जरिए release artifact डाउनलोड किया जाता हैWORKSPACEमेंload("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")का उपयोग करेंMODULE.bazelमेंhttp_jar = use_repo_rule("@bazel_tools//tools/build_defs/repo:http.bzl", "http_jar")का उपयोग करें
WORKSPACEयाMODULE.bazelमें[version]की जगह भरकरcopybara_deploy.jarको specify करें- BUILD file में
java_binarydeclare करकेcom.google.copybara.Mainको main class के रूप में उपयोग किया जाता है - execution example है
bazel run //tools:copybara -- migrate copy.bara.sky
External Bazel repository के रूप में source build
- Copybara dependencies के लिए convenience macros दिए जाते हैं
WORKSPACEमेंhttp_archiveजोड़ें और{{ sha256sum }}तथा{{ commit }}values भरें- इसके बाद नीचे दिए गए macros को load और call करें
copybara_repositories()copybara_maven_repositories()copybara_go_repositories()
- workspace के भीतर
bazel run @com_github_google_copybara//java/com/google/copybara -- <args...>के जरिए build और run किया जा सकता है
Docker का उपयोग
- Docker के साथ Copybara को build और run करने का तरीका फिलहाल experimental है
- build
docker build --rm -t copybara .से किया जाता है - run target code root में
docker run -it -v "$(pwd)":/usr/src/app copybara helpके रूप में किया जाता है - container run arguments की जगह environment variables का उपयोग किया जा सकता है
COPYBARA_SUBCOMMAND=migrate: run command बदलता है, defaultmigrateहैCOPYBARA_CONFIG=copy.bara.sky: config file path specify करता है, default root कीcopy.bara.skyहैCOPYBARA_WORKFLOW=default: चलाए जाने वाले workflow को specify करता है, defaultdefaultहैCOPYBARA_SOURCEREF='': sourceref specify करता है, default नहीं हैCOPYBARA_OPTIONS='': Copybara options specify करता है, default नहीं है
- Git config और SSH credentials को Docker container के साथ share किया जा सकता है
- उदाहरण के तौर पर
~/.gitconfig,~/.ssh,SSH_AUTH_SOCKको container में mount किया जा सकता है
- उदाहरण के तौर पर
Documentation और संपर्क
- documentation अभी भी तैयार की जा रही है
- उपलब्ध सामग्री में शामिल हैं
- सवाल mailing list पर पूछे जा सकते हैं
- Bazel test errors को log file
catकिए बिना देखने के लिए~/.bazelrcमेंtest --test_output=streamedजोड़ा जा सकता है
1 टिप्पणियां
Hacker News की रायें
मज़ेदार लगा कि यह पोस्ट ठीक तब आई जब मैंने गेम डेवलपमेंट स्टूडियो में इस्तेमाल के लिए बनाया अपना Perforce support patch open source किया था
Copybara का मुख्य इस्तेमाल internal Google code distribution है, और वह code Piper में है जो Perforce से जुड़ा है—यह देखते हुए Perforce support न होना और सिर्फ Git support का ही ढंग से होना काफ़ी चौंकाने वाला था
PR बनाने से पहले जब Git history देखी तो Gerrit Change-ID के बहुत निशान दिखे, इसलिए थोड़ा डर भी लगा कि कहीं कोई ऐसा Gerrit code review system है जिस तक मेरी access नहीं है और मेरा PR upstream न हो पाए
Perforce के लिए Gerrit/Rietveld न होना भी अफ़सोस की बात है, लेकिन सब कुछ तो नहीं मिल सकता
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-...
बाहरी tools में Critique जितना अच्छा कुछ अभी तक नहीं मिला, और यह हैरान करने वाली बात है कि GitHub के कमजोर PR review tools को ज़्यादातर लोग स्वीकार कर लेते हैं। अगर किसी को इसी स्तर का कोई tool पता हो तो सुनना चाहूंगा
कुछ साल पहले Google छोड़ते समय मैंने काफ़ी बारीकी से खोजा था, और https://codeapprove.com/ सबसे करीब था, लेकिन उसमें भी अभी बहुत कुछ missing था
internal monorepo में रहने वाले gVisor या Bazel जैसे open source projects भी थोड़े-बहुत फर्क के साथ आम तौर पर इसी तरह चलते हैं
इस क्षेत्र का एक और दिलचस्प tool Rust में है: commits sync करने के लिए वह Josh नाम का tool इस्तेमाल करता है
https://josh-project.dev
Rust की तरफ़ से एक blog post भी है
https://blog.rust-lang.org/inside-rust/2026/06/04/how-josh-h...
Meta के पास पहले fbshipit नाम का एक open source tool था, लेकिन public repository के मुताबिक अब वे इसका इस्तेमाल नहीं करते
https://github.com/facebookarchive/fbshipit
क्या इस space में और भी tools हैं?
बाद में यह Git core में merge हो गया
https://manpages.debian.org/testing/git-man/git-subtree.1.en...
https://docs.github.com/en/get-started/using-git/about-git-s...
क्या यह तब भी convenient है जब कई repositories थोड़ा-सा code share करना चाहती हों, लेकिन उसे library में अलग करने, references जोड़ने, version releases publish करने और dependent repositories update करने की मेहनत worth it न हो?
उदाहरण के लिए, क्या इसे ऐसे इस्तेमाल किया जा सकता है कि common domain models वाला एक folder किसी एक main repository से दूसरी repositories में बस sync हो जाए?
यह Go वाली philosophy के करीब use case है: “बहुत सारी dependencies रखने से थोड़ा copy करना बेहतर है”
कुछ projects monorepo में develop होते हैं और Copybara से बाहर export किए जाते हैं
हमारी team internally Starlark ruleset की version management के लिए भी इसका इस्तेमाल करती है
public repository को company की private repository की dependency बनाना development के लिहाज से काफी सिरदर्द है। ऐसी dependencies अगर tree की तरह बढ़ने लगें तो सच में headache बन जाती हैं
इसे काफी समय से इस्तेमाल कर रहा हूँ, और आम तौर पर तब इस्तेमाल करता हूँ जब किसी बड़े प्रोजेक्ट के अंदर बनाया गया कोई tool इतना बड़ा हो जाए कि उसे स्वतंत्र रूप से release किया जा सके
यह code को बाहर भेजने और फिर वापस लाने वाली पूरी two-way deployment करने जितना powerful है, लेकिन वह सब इतना झंझट भरा है कि मैं उससे बचता हूँ
मैं आम तौर पर मूल repository से एक folder अलग करने, लेकिन history बचाए रखने वाले सरल one-off export के लिए इसे इस्तेमाल करता हूँ। उसके बाद development नए repository में चला जाता है
नया project structure पूरी तरह अलग होने पर भी
Git blameकाम करता है, इसलिए मैं संतुष्ट हूँtwo-way messy हो जाता है, क्योंकि path remapping, file exclusion, header removal जैसे transformations एक दिशा में आसान होते हैं, लेकिन हमेशा साफ़ तौर पर reverse-transform नहीं किए जा सकते
जब दोनों तरफ diverge हो जाते हैं, तो Copybara की baseline tracking उलझे हुए नतीजे देने लगती है। क्योंकि semantic रूप से वही commit भी transformation के बाद अलग-अलग SHA बनाता है
जानने लायक बात यह है कि history “preservation” असली transplant नहीं है, बल्कि rewritten commits को cherry-pick करने का तरीका है। file content और author info आ जाती है, इसलिए
Git blameकाम करता है, लेकिन SHA नए बनते हैंCopybara original SHA को commit message trailer
GitOrigin-RevIdमें रख देता है, इसलिए बाद में repositories के बीच commits मिलाने हों तो यह उपयोगी होता है52 साल से ज्यादा की प्रगति है :-)
जुलाई 2026: Google copybara दो production repositories के बीच code ले जाने देता है
मार्च 1974: IBM COPY दो production partitioned data sets के बीच code ले जाने देता था। OS/MVT और OS/VS2 TSO Data Utilities COPY, FORMAT, LIST, MERGE User's Guide and Reference https://www.computinghistory.org.uk/downloads/8987
Dagster में public repository को बड़े internal monorepo के अंदर रहने देने के लिए hub-spoke model बनाने में Copybara का इस्तेमाल किया, और यह चला भी, लेकिन काफी सारे workaround करने पड़े
https://dagster.io/blog/monorepos-the-hub-and-spoke-model-an...
अगर सिर्फ repository sync चाहिए, बिना exclusions या transformations के, तो शायद मैं इसे इस्तेमाल नहीं करूँगा। अभी के लिए ठीक हो सकता है, लेकिन अगर kaniko या कई Google products/tools की तरह archive या बंद हो गया तो मुश्किल हो सकती है
GitLab में GitLab से GitHub या दूसरे Git providers/servers पर mirroring करने का एक बहुत सरल तरीका है
उदाहरण के लिए external
bzlको internal BlazeBUILDcompatible रूप में बदलना, या external imports और internalthird_partystyle imports के बीच बदलना जैसे कामpure mirror के लिए Copybara जरूरत से ज्यादा heavy है
अच्छा है। मैंने भी करीब 5 साल पहले nested Git repositories और scripts से कुछ similar बनाया था, जिससे private और public repositories को साथ संभालने का उद्देश्य पूरा हुआ
मेरी shell scripts जाहिर तौर पर Google scale की नहीं थीं
git subtreewrapper होगा, लेकिन देखने पर लगता है यह उससे कहीं ज्यादा काम करता हैउदाहरण के लिए sync के दौरान commit author email बदलने की सुविधा भी है