{"id":22788570,"url":"https://github.com/stephane-klein/poc-git-monorepo-multirepos-sync","last_synced_at":"2026-05-03T06:37:56.751Z","repository":{"id":266878719,"uuid":"899625316","full_name":"stephane-klein/poc-git-monorepo-multirepos-sync","owner":"stephane-klein","description":null,"archived":false,"fork":false,"pushed_at":"2024-12-07T19:46:39.000Z","size":7,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-30T16:24:33.322Z","etag":null,"topics":["git","monorepo","multirepo","poc"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stephane-klein.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2024-12-06T16:53:06.000Z","updated_at":"2025-01-15T12:16:49.000Z","dependencies_parsed_at":"2024-12-06T18:37:46.725Z","dependency_job_id":null,"html_url":"https://github.com/stephane-klein/poc-git-monorepo-multirepos-sync","commit_stats":null,"previous_names":["stephane-klein/poc-git-monorepo-multirepos-sync"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/stephane-klein/poc-git-monorepo-multirepos-sync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephane-klein%2Fpoc-git-monorepo-multirepos-sync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephane-klein%2Fpoc-git-monorepo-multirepos-sync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephane-klein%2Fpoc-git-monorepo-multirepos-sync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephane-klein%2Fpoc-git-monorepo-multirepos-sync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stephane-klein","download_url":"https://codeload.github.com/stephane-klein/poc-git-monorepo-multirepos-sync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stephane-klein%2Fpoc-git-monorepo-multirepos-sync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32560906,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-03T06:36:36.687Z","status":"ssl_error","status_checked_at":"2026-05-03T06:36:09.306Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["git","monorepo","multirepo","poc"],"created_at":"2024-12-12T01:32:46.629Z","updated_at":"2026-05-03T06:37:56.736Z","avatar_url":"https://github.com/stephane-klein.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# POC to sync git monorepo with multirepos\n\nMore information on this project (in French): https://notes.sklein.xyz/Projet%2019/\n\n## Walkthrough Demo\n\nThis demo is based on [`tomono`](https://github.com/hraban/tomono) script.\n\n### Create frontend repository\n\nLet's start by creating a frontend repository:\n\n```sh\n$ mkdir frontend\n$ cd frontend\n$ git init\nDépôt Git vide initialisé dans /tmp/tmp.aOzaWeLmKk/frontend/.git/\n\n$ echo \"Frontend README\" \u003e README.md\n$ git add README.md\n$ git commit -m \"First frontend import\"\n[main (commit racine) 40a64bb] First frontend import\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\n\n$ echo \"Frontend feature a\" \u003e feature-a.txt\n$ git add feature-a.txt\n$ git commit -m \"Add Frontend feature-a.txt\"\n[main 61a7b52] Add Frontend feature-a.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 feature-a.txt\n\n$ git switch -c feature-b\nBasculement sur la nouvelle branche 'feature-b'\n$ echo \"Frontend Feature b\" \u003e feature-b.txt\n$ git add feature-b.txt\n$ git commit -m \"Add Frontend feature-b.txt\"\n[feature-b 97d082f] Add Frontend feature-b.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 feature-b.txt\n\n$ git log\ncommit 97d082fd95461d1ad56398ba9084764009415738\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-b.txt\n\ncommit 61a7b52b0fa86408f8f8e85a5fafcf829eabe334\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-a.txt\n\ncommit 40a64bb04659f9ada47b77e6bbe194e7dd68ecd4\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    First frontend import\n$ git switch main\nBasculement sur la branche 'main'\n$ cd ..\n```\n\n\n### Create backend repository\n\nNext, let's create a backend repository:\n\n\n```sh\n$ mkdir backend\n$ cd backend\n$ git init\nDépôt Git vide initialisé dans /tmp/tmp.aOzaWeLmKk/backend/.git/\n$ echo \"Backend README\" \u003e README.md\n$ git add README.md\n$ git commit -m \"First backend import\"\n[main (commit racine) f55b62f] First backend import\n 1 file changed, 1 insertion(+)\n create mode 100644 README.md\n$ echo \"Backend Feature c\" \u003e feature-c.txt\n$ git add feature-c.txt\n$ git commit -m \"Add Backend feature-a.txt\"\n[main baac6be] Add Backend feature-a.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 feature-c.txt\n$ git switch -c feature-d\nBasculement sur la nouvelle branche 'feature-d'\n$ echo \"Backend Feature d\" \u003e feature-d.txt\n$ git add feature-d.txt\n$ git commit -m \"Add backend feature-d.txt\"\n[feature-d 9c3aad5] Add backend feature-d.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 feature-d.txt\n$ git log\ncommit 9c3aad5bcd333dc80d45122665f532dab56c0600\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add backend feature-d.txt\n\ncommit baac6bebe4a668b641395851c050868dce55e936\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Backend feature-a.txt\n\ncommit f55b62fc2c2dabc78302cb9d335311cb10fca685\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    First backend import\n$ git switch main\nBasculement sur la branche 'main'\n$ cd ..\n```\n\n\n### Create mono repository\n\nNow let's check the folders and files that have been created:\n\n\n```sh\n$ tree .\n.\n├── backend\n│   ├── feature-c.txt\n│   └── README.md\n└── frontend\n    ├── feature-a.txt\n    └── README.md\n\n3 directories, 4 files\n```\n\nLet's move on to the part we're interested in: creating a single repository:\n\n```sh\nexport MONOREPO_NAME=monorepo\n\ntomono \u003c\u003cEOF\n$PWD/frontend frontend\n$PWD/backend backend\nEOF\nDépôt Git vide initialisé dans /tmp/tmp.aOzaWeLmKk/monorepo/.git/\nDepuis /tmp/tmp.aOzaWeLmKk/frontend\n * [nouvelle branche] feature-b  -\u003e frontend/feature-b\n * [nouvelle branche] main       -\u003e frontend/main\nDepuis /tmp/tmp.aOzaWeLmKk/backend\n * [nouvelle branche] feature-d  -\u003e backend/feature-d\n * [nouvelle branche] main       -\u003e backend/main\n4 chemins mis à jour depuis l'index\n```\n\nLet's check the contents of the monorepo\n\n```sh\n$ cd monorepo\n$ tree .\n.\n├── backend\n│   ├── feature-c.txt\n│   └── README.md\n└── frontend\n    ├── feature-a.txt\n    └── README.md\n\n3 directories, 4 files\n$ git log\ncommit a9c570256287fc4734b9fbc2ee567e3c6b4e804e\nMerge: 37443bd ea73ada\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Merge backend/main\n\ncommit 37443bd7b430f280072abe8cf310e36d780d78ae\nMerge: aaa1b6b d186ca4\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Merge frontend/main\n\ncommit ea73adab10636fb5de62fd7fd6e5343ceee1577d\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Move all files to backend/\n\ncommit aaa1b6b031d95e53ccbad7576aed59d0279a2bbb\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Root commit for monorepo branch main\n\ncommit d186ca4250be1aecbc9df84efea8760a2d9a80cb\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Move all files to frontend/\n\ncommit baac6bebe4a668b641395851c050868dce55e936\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Backend feature-a.txt\n\ncommit 61a7b52b0fa86408f8f8e85a5fafcf829eabe334\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-a.txt\n\ncommit f55b62fc2c2dabc78302cb9d335311cb10fca685\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    First backend import\n\ncommit 40a64bb04659f9ada47b77e6bbe194e7dd68ecd4\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    First frontend import\n$ git remote -v\nbackend\t/tmp/tmp.aOzaWeLmKk/backend (fetch)\nbackend\t/tmp/tmp.aOzaWeLmKk/backend (push)\nfrontend\t/tmp/tmp.aOzaWeLmKk/frontend (fetch)\nfrontend\t/tmp/tmp.aOzaWeLmKk/frontend (push)\n```\n\nLet's add some files to the root of the mono repo:\n\n```sh\n$ echo \"Monorepo\" \u003e README.md\n$ git add README.md\n$ echo -e [tools]nnode = 20.12.2 \u003e .mise.toml\n$ git add .mise.toml\n$ git commit -m \"Root monorepo files\"\n[main 0e9cf40] Root monorepo files\n 2 files changed, 3 insertions(+)\n create mode 100644 .mise.toml\n create mode 100644 README.md\n```\n\n### Add commit to frontend\n\nNow, let's make some changes to the frontend repository:\n\n```sh\n$ cd ../frontend\n$ echo \"Frontend Feature e\" \u003e feature-e.txt\n$ git add feature-e.txt\n$ git commit -m \"Add Frontend feature-e.txt\"\n[main 05dd399] Add Frontend feature-e.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 feature-e.txt\n$ git log\ncommit 05dd39973564484dd321396b711aa864482673ed\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-e.txt\n\ncommit 61a7b52b0fa86408f8f8e85a5fafcf829eabe334\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-a.txt\n\ncommit 40a64bb04659f9ada47b77e6bbe194e7dd68ecd4\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    First frontend import\n```\n\nPull `frontend` last commit to `monorepo`:\n\n```sh\n$ cd ../monorepo\n$ git fetch frontend\nDepuis /tmp/tmp.aOzaWeLmKk/frontend\n   61a7b52..05dd399  main       -\u003e frontend/main\n$ git merge -X subtree=frontend/ frontend/main --no-edit\nMerge made by the 'ort' strategy.\n frontend/feature-e.txt | 1 +\n 1 file changed, 1 insertion(+)\n create mode 100644 frontend/feature-e.txt\n```\n\nThis is what the last log lines look like:\n\n```sh\n$ git log -n3\ncommit f911bdb130a95fe52312b84c478d007bf331d63a\nMerge: 0e9cf40 05dd399\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Merge remote-tracking branch 'frontend/main'\n\ncommit 0e9cf406cc21fd7fc78c3b454757e25e04d49147\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Root monorepo files\n\ncommit 05dd39973564484dd321396b711aa864482673ed\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-e.txt\n```\n\n## Making changes in the `./frontend/` folder of the *monorepo*\n\nNow I want to make changes directly in the `./frontend/` folder of the *monorepo*.\n\nI'm using a method based on *git patch* because I don't want to take the risk of pushing\nchanges directly to the multirepository, which remains the source of truth.  \nI don't want to risk disrupting the work of my colleagues.\n\n```sh\n$ cd frontend\n$ echo \"Frontend Feature f\" \u003e feature-f.txt\n$ git add feature-f.txt\n$ git commit -m \"Add Frontend feature-f.txt\"\n[main 2b9c8c3] Add Frontend feature-f.txt\n 1 file changed, 1 insertion(+)\n create mode 100644 frontend/feature-f.txt\n$ git log -n3\ncommit 2b9c8c347613c30a63cf03d6623d7cbd82794f37\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-f.txt\n\ncommit f911bdb130a95fe52312b84c478d007bf331d63a\nMerge: 0e9cf40 05dd399\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Merge remote-tracking branch 'frontend/main'\n\ncommit 0e9cf406cc21fd7fc78c3b454757e25e04d49147\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Root monorepo files\n$ git format-patch --relative -1 HEAD\n0001-Add-Frontend-feature-f.txt.patch\n$ cat 0001-Add-Frontend-feature-f.txt.patch\nFrom 2b9c8c347613c30a63cf03d6623d7cbd82794f37 Mon Sep 17 00:00:00 2001\nFrom: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate: Sat, 7 Dec 2024 20:46:18 +0100\nSubject: [PATCH] Add Frontend feature-f.txt\n\n---\n feature-f.txt | 1 +\n 1 file changed, 1 insertion(+)\n create mode 100644 frontend/feature-f.txt\n\ndiff --git a/feature-f.txt b/feature-f.txt\nnew file mode 100644\nindex 0000000..fd77637\n--- /dev/null\n+++ b/feature-f.txt\n@@ -0,0 +1 @@\n+Frontend Feature f\n-- \n2.47.1\n\n```\n\nNow I'm going to apply this patch in the `frontend` repository upstream.\n\n```sh\n$ cd ../../frontend/\n$ git am ../monorepo/frontend/0001-Add-Frontend-feature-f.txt.patch\nApplication de  Add Frontend feature-f.txt\n$ git log -n3\ncommit b860de788f1c2ae056778f9c3048900d0887afaa\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-f.txt\n\ncommit 05dd39973564484dd321396b711aa864482673ed\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-e.txt\n\ncommit 61a7b52b0fa86408f8f8e85a5fafcf829eabe334\nAuthor: stephane-klein \u003ccontact@stephane-klein.info\u003e\nDate:   Sat Dec 7 20:46:18 2024 +0100\n\n    Add Frontend feature-a.txt\n```\n\n## End of demo\n\nYou can visit https://github.com/stephane-klein/poc-git-monorepo-multirepos-sync-result-example to see what monorepo looks like at the end of this demo.\n\n## Contribute\n\nThis `README.md` file is automatically generated by the `generate-readme.sh` script,\nwhich executes the `demo.sh` script and saves the output in `README.md`.\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephane-klein%2Fpoc-git-monorepo-multirepos-sync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstephane-klein%2Fpoc-git-monorepo-multirepos-sync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstephane-klein%2Fpoc-git-monorepo-multirepos-sync/lists"}