Задать вопрос
@Derafer

Как копировать определенные ветки Git между репозиториями с изменением авторства?

Есть два git репозитория repo1 и repo2. В перовом репозитории есть две ветки public и privat, во втором только public. Как правильно нужно скопировать первый репозиторий во второй, чтобы скопироваласть только ветка public без privat с сохранением всех коммитов и изменением авторства на чтото вроде autobot?
  • Вопрос задан
  • 1493 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
vyachin
@vyachin
Ищу работу
1. Клонируем repo1 в какую нить папку git clone repo1-url
2. Меняем у коммитов автора вот тут написано как https://help.github.com/articles/changing-author-info/
3. Подключаем 2 репозиторий git remote add repo2 repo2-url
4. Отправляем ветку public во второй репозиторий git push -u repo2 public
Ответ написан
Комментировать
Lobotomist
@Lobotomist
Software Developer
Я так понимаю, что эта операция у вас не единовременная, а должна происходить регулярно. То есть repo2 у вас все время должен содержать текущую версию ветки public с коммитами без указания авторства.

Можно при пуше в repo1/public выполнять код, который все новые коммиты перенесет в ветку repo1/public-bot, изменив у них автора и запушит в repo2/public.
Перед этим нужно руками эту ветку (repo1/public-bot) подготовить, то есть чтобы код в ней совпадал с текущим repo1/public и при переносе коммитов не было конфликтов. Тут можно воспользоваться ссылкой, которую дал vyachin.

Ниже я напишу пример реализации, но он, скорее всего, не будет работать корректно, если в этой ветке есть коммиты слияния или если она будет ребэйзиться. Так что, его надо еще допилить.

Реализация
В репозитории repo1 вешаете хук post-receive. Документация по хукам
Я не спец по bash, так что наверняка можно написать получше, вынести что-то в функции и т.п.

#!bash
 
while read oldrev newrev refname
do
	# выполняем код только при обновлении ветки public
	if [ $refname = refs/heads/public]
	then
		git checkout public-bot
		# получаем список новых коммитов
		commits=$(git log --oneline --reverse test..master --format="%h")
		for rev in $commits
		do
			git cherry-pick $rev
			git commit --amend --no-edit --author="bot <bot@e.mail>"
		done
	fi
done
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы