Вопрос: Как я могу зеркалировать каталог в git-репо в другой git-репо?


У меня есть каталог /amp в RepoA и RepoB (сначала заполняется содержимым / amp). Я хочу отразить любые изменения в / amp в RepoA в RepoB.

Является ли это возможным ?

P.S: RepoA содержит множество других каталогов. Я хочу только зеркалировать / amp dir. В то время как у RepoB будет только контент / amp, а не какой-либо другой.


7


источник


Ответы:


Вы можете использовать git подмодули  для этого первым шагом было бы создание репозитория из вашего каталога /amp а затем использовать его как подмодуль в других хранилищах.

Делать /amp репозиторий, который вы могли бы сделать:

$ cd /path/to/amp
$ git init
$ git add .
$ git commit -m "First commit"

Теперь давайте предположим, что вы будете использовать github, вы можете опубликовать свое репо, выполнив:

$ git remote add origin git@github.com:<your-user>/amp.git
$ git push -u origin master

Сейчас на repoA а также repoB вам нужно будет добавить новый amp репо как подмодуль, это можно сделать, выполняя что-то вроде этого:

$ cd /path/to/repoA
$ git submodule add -b master git@github.com:<you-user>/amp ampMirror

То же самое для репо repoB

$ cd /path/to/repoB
$ git submodule add -b master git@github.com:<you-user>/amp ampMirror
$ git commit -m "added appMirror submodule"

Обратите внимание, что имя, которое я даю каталогу в пределах repoA а также repoB является ampMirror но это может быть все, что вы хотите, действительно, вы можете использовать одно и то же имя, просто используя:

git submodule add -b master git@github.com:<you-user>/amp 

Структура каталогов будет выглядеть примерно так:

repo(A/B)
├── .git/
├── .gitmodules   <-- created after adding the submodule
├── foo
└── ampMirror
    ├── .git/     <-- repo to keep/track changes for app (need to git pull)
    └── foo

Теперь каждый раз, когда в вашу amp repo вам нужно будет обновить «pull» изменения в ваших репозиториях, например:

$ cd /path/to/repoB
$ cd appMirror
$ git pull
$ cd ..    <--- get back to your project root
$ git commit -am "update submodule" 

Другой способ сделать это и стать полезным, если имеет более одного подмодуля:

$ cd /path/to/repo(A/B)
$ git submodule foreach git pull origin master
$ git commit -am "updated submodules"

Надеюсь, это поможет вам лучше понять.


5



Ответ nbari верен, что подмодули предназначены для решения этой проблемы.

Один из потенциальных недостатков подмодулей заключается в том, что они не полностью прозрачны для пользователя. Если вы хотите, чтобы некоторые люди могли использовать RepoA а также RepoB без необходимости ничего знать о подмодулях, альтернатива git поддерево , Основные команды, которые вам нужно использовать:

  • git subtree split, который может извлечь подкаталог amp из RepoA к собственному хранилищу, скажем, RepoAMP (вы также можете использовать git subtree push нажать на результат).

  • git subtree merge которые могут сливаться RepoAMP в каталог /amp в RepoB (вы также можете использовать git subtree pull для загрузки и слияния в одной команде).

В конце, RepoA а также RepoB являются «нормальными» репозиториями. Зеркалирование не выполняется автоматически, но git subtree помогает вам делать это правильно.


2



Если подмодуль вам не по душе, альтернативный подход будет драйвер фильтра содержимого в .gitattributes repoA, для всех файлов в /amp/,

Видеть Pro Book :

https://git-scm.com/book/en/v2/images/clean.png

Более конкретно, clean«фильтр будет вызываться автоматически git commit (только для /amp/** files), и затем может выполнить необходимую команду, чтобы воспроизвести изменения в repoB,

Этот чистый скрипт слияния будет выглядеть так:

#!/bin/sh
git --work-tree=/path/to/repoA/amp --git-dir=/path/to/repoB/.git add .
git --git-dir=/path/to/repoB/.git commit -m "import from repoA/amp"

0



Если RepoB будет иметь /amp чем правильнее сделать из него библиотеку. Поместите эту библиотеку в зависимость от вашего проекта в RepoA. Как это сделать, зависит от языка (менеджер пакетов), который вы используете.

Для среды разработчиков вы можете создать символическую ссылку в RepoA, которая укажет на RepoB.


-1