лучший / самый простой способ синхронизировать несколько (не голых) репозиториев Git - PullRequest
4 голосов
/ 25 августа 2011

У меня есть несколько не голых репозиториев Git.Существует один центральный репозиторий Git (или, по крайней мере, он обрабатывается как центральный репозиторий; это может измениться), но это тоже не голое (потому что я хочу оформить заказ на той же машине).Моя история в основном линейная, и я единственный человек, который когда-либо будет вносить изменения в этот репозиторий, поэтому маловероятно, что конфликты произойдут.(Это мой каталог документов.)

Вставка непосредственно в другой не пустой репозиторий не работает, если я везде использую ветку master.Существует receive.denyCurrentBranch, который позволил бы это, но это не очень помогло мне, потому что (1) он не обновляет локальную проверку и (2) я боюсь того, что произойдет в случае конфликта.

Здесь есть несколько связанных / похожих вопросов:

Я хочу решение, которое на 100% безопасно.Поэтому я думаю, что использование post-update хука для меня не вариант.

Я думаю, что мой случай использования не является чем-то необычным, поэтому я задаюсь вопросом, есть ли какие-то общие решения для этого.Есть ли?

Я думаю, что я хочу:

  • Нажать локальный master на какой-нибудь удаленный специальный номер (например, merge-request-xy) (например, git push origin master:merge-request?).
  • На пульте дистанционного управления, если мы можем выполнить быструю перемотку вперед и очистить рабочую копию, обновите рабочую копию и удалите ссылку (в основном git merge merge-request && git branch -D merge-request?).

Это было бы безопасно или хороший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 25 августа 2011

Решение, которое вы предложили, безопасно, если вы (1) нажимаете на ветку, отличную от master, например, merge-request и (2) проверяете слияние.Для второй части, быстрой перемотки вперед, если на пульте все в порядке, вы можете использовать post-update ловушку, подобную этой:

#!/bin/sh

# check args to see if merge-request was pushed,
# and do nothing if it wasn't
if ! $(echo $@ | grep -q 'merge-request');
then
 echo "merge-request not updated"
 exit 0
fi

# cancel if master is not checked out
THIS_BRANCH=$(git branch --no-color | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/')
if [ "$THIS_BRANCH" != "master" ];
then
  echo "master not checked out, not merging"
  exit 1
fi

# cancel if working dir is dirty
if [ $(git status --porcelain | wc -l) != 0 ];
then
  echo "working dir is dirty, not merging"
  exit 1
fi

# try to merge, but only do so if the merge is fast-forward
# try to delete, but only do so if the merge succeeded
git merge --ff-only merge-request && git branch -d merge-request

Убедитесь, что chmod +x ваш скрипт после обновления,Когда вы нажимаете, вывод этой ловушки будет отображаться в консоли с предисловием «remote:»

Чтобы перейти с master на origin/merge-request на пульте, вы можете установить pushvar в вашей удаленной конфигурации в .git/config (который позволяет вам звонить git push origin:

[remote "origin"]
    push = +refs/heads/*:refs/merge-request/*

или вы можете установить псевдоним для репозитория:

[alias]
    push = push origin master:merge-request
0 голосов
/ 25 августа 2011

Опасная часть переноса в не обнаженное хранилище с хуком post-update заключается в том, что удаленная рабочая копия нечистая и / или вы не можете выполнить ускоренную перемотку вперед. Если вы собираетесь использовать эти предварительные условия в своем решении, вы можете также использовать более проверенный хук post-update с опцией проверки.

Если вы не можете гарантировать эти предварительные условия, вам все равно придется разрешать любые конфликты с другого конца. В этом случае вы снова можете воспользоваться опцией post-update hook, но обязательно выполните проверку без --force, поэтому при возникновении конфликта вы не потеряете локальные изменения.

Я до сих пор не понимаю, почему так много людей не хотят иметь репо с голым и не голым репозиторием на одной и той же машине. У меня дома есть репо, к которому я обращаюсь как из дома, так и с работы. Когда я начинаю работать в любом месте, я захожу в свой не обнаженный репозиторий. Это занимает 2 секунды, и я всегда нахожусь в лучшем физическом месте для разрешения любых потенциальных конфликтов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...