Безопасно ли 'git svn dcommit' коммиты вышли из строя - PullRequest
0 голосов
/ 25 октября 2018

Я работаю в проекте, в котором есть главный репозиторий Subversion.

Я начал использовать локальное git-репо вместе с мостом git-svn.Мой рабочий процесс:

  • Передайте обновления в мастер, используя git svn rebase
  • Прежде чем работать над ошибкой, создайте ветку с git checkout -b XXXXX
  • Передайте изменения вветвь
  • Объединение ветви с мастером
  • git svn dcommit для передачи изменений с мастера обратно в удаленное хранилище SVN

На данный момент у меня есть паранаборы изменений, которые были объединены в master, но еще не переданы обратно в SVN.Я пока не могу выдвинуть их, потому что они ожидают других зависимостей, но между тем мне нужно выпустить еще одно срочное исправление.

git log в моем мастере теперь выглядит примерно так:

* 5ac10e3 (HEAD, master, b11859) Bug#1234: Urgent Bug Fix
* 2c0f704 Bug#1001 Some Large Feature
* beb3e0c Bug#1002 Another Large Feature
* c84efc2 (origin/trunk) Bug#1003 Already committed stuff

Я хочу dcommit 5ac10e3, но удерживать 2c0f704 и beb3e0c до некоторого времени позже.

Похоже, я мог бы git svn dcommit --interactive и затем ответить «да» только длякоммиты я хотел бы сделать сейчас.Но смогу ли я повторно запустить эту команду и позднее отменить коммиты?И будет ли это безопасно?

Если нет, какой рабочий процесс лучше всего использовать?У меня есть подозрение, что мне не следовало объединять эти два коммита в мастер, пока я не был готов отправить их в svn.

Я опасаюсь предупреждений, которые я читал в Интернете о необходимости поддерживать линейную историю git дляизбегайте путаницы в репозитории svn.

Я работаю над Centos 7 с git 1.8.3.1.

ОБНОВЛЕНИЕ : git log --graph --decorate (по запросу @schwern)

* commit 5ac10e3937ef4e5b95823c73e03c893bd29b22f5 (HEAD, master, b11859)
| Author: harmic <harmic@xxxxxxxxx>
| Date:   Tue Oct 23 15:23:21 2018 +1100
|
|     Bug#1234: Urgent Bug Fix
|
* commit 2c0f7046282d4b84650b9d3a05382ad245755496
| Author: harmic <harmic@xxxxxxxxx>
| Date:   Tue Oct 23 13:36:58 2018 +1100
|
|     Bug#1001 Some Large Feature
|
* commit beb3e0c85d55450a248a277230f6a3fbbc5dc529
| Author: harmic <harmic@xxxxxxxxx>
| Date:   Mon Oct 22 12:12:17 2018 +1100
|
|     Bug#1002 Another Large Feature
|
* commit c84efc25bd9d526dafb9090a2b03fc7cfca46edd (origin/trunk)
| Author: eharmic <eharmic@44605e08-610d-0410-9c87-3f595476ec80>
| Date:   Wed Oct 24 03:38:39 2018 +0000
|
|     Bug#1003 Already committed stuff
|
|     git-svn-id: svn://svn.company.com/proj/trunk@13941 44605e08-610d-0410-9c87-3f595476ec80
|

1 Ответ

0 голосов
/ 25 октября 2018

Я давно не использовал git-svn, но техника для распутывания запутанных коммитов должна быть такой же.Просто замените push на dcommit.

На данный момент у меня есть несколько наборов изменений, которые были объединены в мастер, но еще не переданы обратно в SVN.Я пока не могу выдвинуть их, потому что они ожидают других зависимостей, но между тем мне нужно выпустить еще одно срочное исправление.

Как и в Git, отмените слияние.Затем поместите ваше срочное исправление на master.Теперь, когда срочное исправление отделено от другой работы, вы можете нажать master.

При просмотре вашего репозитория коммит слияния отсутствует, слияние должно быть ускоренным.

Сначала, избавься от b11859.Это будет просто поддерживать старые коммиты, пока мы будем перемешивать вещи.Это просто ярлык.Мы воссоздадим его позже.

git branch -d b11859
git log --graph --decorate --all

* 5ac10e3 (HEAD, master) Bug#1234: Urgent
* 2c0f704 Bug#1001
* beb3e0c Bug#1002
* c84efc2 (origin/trunk) Bug#1003

Мы хотим, чтобы это срочное исправление было сразу после origin/trunk, чтобы мы могли отменить его без всего остального.

Самое простое, что можно сделать, это интерактивная перебазировка для изменения порядка коммитов в мастере.

git checkout master
git rebase -i origin/trunk

Это вызовет редактор, подобный так:

pick e881c96 Another large feature
pick c96a462 Some Large Feature
pick f848cca Urgent

# Rebase ba50aa8..f848cca onto ba50aa8 (3 commands)
#
# Commands:
...a bunch of instructions you should read...

Это коммиты на masterс origin/trunk от первого до последнего.Вы буквально переупорядочиваете их в редакторе по своему вкусу.Мы хотим, чтобы Urgent был первым.

pick f848cca Urgent
pick e881c96 Another large feature
pick c96a462 Some Large Feature

Затем сохраните и выйдите.Ваши коммиты будут переупорядочены.Если есть какие-либо конфликты, исправьте их и следуйте инструкциям.

git log --graph --decorate --all

* c96a462 (HEAD, master) Bug#1001
* e881c96 Bug#1002
* f848cca Bug#1234: Urgent
* c84efc2 (origin/trunk) Bug#1003

Теперь нам нужно вернуться master обратно к Срочному коммиту.Сначала воссоздайте старую ветку, чтобы сохранить их коммиты.

git branch old_branch
git log --graph --decorate --all

* c96a462 (HEAD, master, old_branch) Bug#1001
* e881c96 Bug#1002
* f848cca Bug#1234: Urgent
* c84efc2 (origin/trunk) Bug#1003

Затем вернитесь master обратно к Срочному коммиту.

git branch -f master f848cca
git log --graph --decorate --all

* c96a462 (HEAD, old_branch) Bug#1001
* e881c96 Bug#1002
* f848cca (master) Bug#1234: Urgent
* c84efc2 (origin/trunk) Bug#1003

Теперь, когда другие изменения были удалены измастер, вы можете нажать / dcommit только ваше срочное исправление ошибки из master.

Как только это будет сделано, вы можете снова объединить old_branch в master и запустить b11859.

...