2010-06-26 3 views
3

У меня есть удаленный git-репозиторий только для чтения A, который я клонировал в своей локальной файловой системе. A периодически обновляется, и я извлекаю и объединяю обновленный код в своей системе после каждого обновления.Git: как работать с несколькими репозиториями?

Я хочу сотрудничать с членами моей команды в файлах A, для которых я создал новый удаленный репозиторий B.

Как мне синхронизировать B с моим местным хранилищем? Я хотел бы узнать правильную последовательность команд и параметры конфигурации для достижения моих целей. Вот сценарии, которые я хотел бы решить: 1. Потяните с A после того, как появились обновления, нажмите на B. 2. Потяните с A, объедините его с моими локальными файлами, затем нажмите на B, слияние с репо на B. 3. Я хотел бы, чтобы все A, мое местное репо и B имели одинаковые ветки.

Буду благодарен за любую помощь. Если мой вопрос не очень ясен, укажите его, и я попытаюсь его отредактировать. Спасибо.

+0

Я рекомендую читать 'git help workflows', в основном это касается управления филиалами, но как только вы получили это, управление многочисленными репозиториями кажется менее обременительным. – xenoterracide

ответ

1

Я предполагаю, что у вас есть два удаленные точки A и B, которые имеют только настроенный URL. Если вы не следуете refspecs, прочитайте relevant chapter в книге ProGit.

1: Вытащите из А после того, как есть обновления, нажмите на нее, чтобы B

$ # pull = fetch + (often fast-forward merge) 
$ git fetch A # fetches all objects from A (all branches, commits; everything) 
$ git push B 'refs/remotes/A/*:refs/heads/*' 
$ # I've quoted so that the shell doesn't try to expand the * 

EDIT: я предполагал, что вы не хотите, чтобы объединить изменения в ваши местные отделения.

2: Вытащите из А, объединить его с моими локальными файлами, а затем вставьте его в B, сливаясь с репо В.

$ git pull A # fetch + attempt to merge changes in all branches 
$ # Resolve any conflicts here 
$ git push B '+refs/heads/*:refs/heads/*' # omit the + if it's a FF push 
$ # Default is to push matching branches 

EDIT: Вышесказанное не сливать изменения B. Если вы хотите сделать это, вы также должны вытащить изменения из B и объединить их в свои локальные ветви до нажатия.

3: Я хотел бы все А, мой местный репо и B имеют идентичные ветви

$ git pull A 
$ git checkout branchx 
$ git reset --hard A/branchx # Warning! All local changes will be destroyed 
$ # Repeat the above for all branches 
$ git push B '+refs/heads/*:refs/heads/*' # Warning! Data in B is overwritten 

EDIT: Если вы хотите, чтобы удалить устаревшие ветви отслеживания, запустите

$ git remote prune A 
$ git remote prune B 
0

Я предлагаю настроить cronjob на хосте, который имеет B. Таким образом, обновления с репо A вытягиваются своевременно (скажем, два раза в час). И вам просто нужно тянуть от B.

+0

Репо только для чтения на A содержит обновления, и моя команда должна работать над этим репо. Для этого прямо сейчас все мы клонировали A на наших локальных машинах, и каждый раз при каждом новом обновлении мы вытягиваем. Мы работаем над локальными файлами и обмениваемся файлами друг с другом. Но я хочу, чтобы наша команда имела частное репо B, на котором мы можем продвигать наши обновления (чтобы все остальные могли синхронизироваться). У меня нет доступа ssh к B (или привилегии для создания заданий cron). Я хочу узнать правильный метод для выполнения задачи, после чего я сам самостоятельно определяю правильный механизм автоматизации. – vpk

2

вы можете попробовать

GIT клон repoB URL ...
мерзавец удаленного добавить repoA URL-к-repoA
мерзавец тянуть repoA

1)

git pull repoA
git толчок репоB

2)

мерзавец тянуть repoA
мерзавец контроль местного филиала к сливаться
мерзавец слияния repoA/удаленного филиала к сливаться
GIT нажимной repoB

3) Я не уверен, есть ли какой-либо трюк, чтобы проверить все ветки на repoA на repoB или на локальное репо только с одной командой ... если их нет, вы всегда можете сделать это вручную ч

мерзавец фотография --track -b branch1 repoA/branch1

и когда вы нажимаете, они должны нажать на соответствующую ветвь в удаленном

+0

Спасибо @insidepower за помощь. Можем ли мы вытащить из одного удаленного репо и нажать на другое дистанционное репо? Нужно ли мне менять некоторые настройки конфигурации (например, URL-адрес удаленного репо1 и удаленного репо2)? – vpk

+0

@jjossarin: yup, вам просто нужно сделать «git remote add », тогда git push : ... – ken

Смежные вопросы