Подтвердить что ты не робот

Скручивание или редактирование некоторых коммитов перед выполнением git -svn dcommit?

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

Во время работы с git -svn я делаю много инкрементных проверок git, которые не проверяются. Их сообщения git commit отражают это.

Каков наилучший способ использования git -svn, но следуйте правилам для svn-репозитория? Должен ли я просто скворовать все коммиты в одну транзакцию svn? Могу ли я переписать сообщения о фиксации для каждой ревизии с информацией рецензента? Могу ли я "вручную" переместить каждое отдельное изменение в главную ветвь git и изменить сообщение фиксации каждого из них перед выполнением git -svn dcommit?

4b9b3361

Ответ 1

Вы можете интерактивно пересобирать локальную ветку с веткой отслеживания Subversion, которая предоставляет вам возможность выкачать и исправлять фиксацию.

В следующий раз, когда вы dcommit, dcommit будет воспроизводить вашу историю за один раз, и это то, что будет сделано для Subversion.

Предположения:

  • Локальная ветка - мастер
  • Мастер проверен
  • Удаленная ветка отслеживания называется git -svn
  • git -svn обновлен

Что делать:

$ git rebase -i git-svn

Ваш редактор по умолчанию откроется со списком коммитов в master для переустановки с git -svn. Вы можете выбрать, отредактировать или раздавить фиксацию (смешайте и, если хотите, поиграйте).

После того, как вы сделаете свой выбор, откроется еще один временный файл, отображающий сообщения фиксации для каждой из переписываемых вами коммитов. Здесь вы исправляете сообщение фиксации.

Предостережения:

Вы переписываете историю своего репозитория, проявляйте осторожность. Возможно, стоит поэкспериментировать с этим поведением, пока не почувствуете уверенность.

Ответ 2

Я работаю в ветке на git, затем мастер проверки, git svn rebase и, наконец, объединять ветвь в мастер.

В этот момент git svn dcommit поместит все промежуточные коммиты в svn по одному с их исходными сообщениями - не то, что нужно! Но если я использую git commit --amend, чтобы изменить сообщение фиксации слияния из стандартного сообщения слияния на что-то, что соответствует нашей политике для транзакций svn, dcommit объединяет их все вместе как одно под новым сообщением. Win.

Я обнаружил, что это, похоже, не работает, если мастер не изменился в течение всего срока службы ветки - коммиты просто быстро пересылаются, без сообщения "объединенная ветка", поэтому лучше всего добавить --no-ff флаг git merge.

Резюме:

git checkout branch
<do work>
git checkout master
git svn rebase
git merge --no-ff branch
git commit --amend
<policy-compliant commit message>
git svn dcommit

Ответ 3

Да, вы можете переписать сообщения о фиксации. Да, вы можете просто скворовать их всех в одну фиксацию. Это, вероятно, зависит от процесса обзора и того, сколько вы делаете сразу.

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

В целом, ответ "зависит от этого" и "Git достаточно гибкий, чтобы делать все, что вам нужно".

Ответ 4

Это может стоить попробовать, я относительный новичок, но сейчас это то, что я делаю:

Создайте клон удаленного репозитория svn:

# clone svn repository
git svn clone ....

Создайте обычный репозиторий git (клон клона):

# clone the clone :)
git clone /path/to/original/clone
git checkout -b working

Теперь вы можете работать во втором клоне, как если бы это был обычный репозиторий git (по существу это):

# commit changes, whatever you like
git ci
...

Чтобы вернуть ваши изменения в центральный репозиторий SVN, вернитесь к первому клону и:

# pull and flatten changes
git pull --squash /path/to/working/clone

Параметр --squash означает, что все зафиксированные транзакции объединены в одну фиксацию. Эта фиксация не выполняется немедленно, поэтому вы можете:

git ci
git svn dcommit  

Последний шаг затем подталкивает все как одно фиксированное.

Изменить. Обычно я не рекомендую использовать --squash в других обстоятельствах, но обратите внимание, что рабочий репозиторий сохраняет полную полную историю (невосприимчив к сквошу), но то, что вы отправляете вверх по течению, раздавлено в единую чистую фиксацию, которая в этом случае необходима. Я считаю, что это разумный компромисс.