Как dcommit только выбранные патчи с git svn? - PullRequest
10 голосов
/ 10 июня 2009

В моем репозитории git-svn есть несколько локально исправленных патчей, которые я еще не добавил в наше svn-репо. Обычный git svn dcommit передаст все эти патчи в svn. Я хотел бы зафиксировать только некоторые из моих патчей (простые исправления ошибок), но не другие (непроверенные основные изменения). Как я могу сделать это с помощью git svn?

Ответы [ 3 ]

10 голосов
/ 17 марта 2010

Я следовал процедуре здесь:

http://fredericiana.com/2009/12/31/partial-svn-dcommit-with-git/

Если вам удобно перебазировать, он работает довольно хорошо.

5 голосов
/ 23 июня 2009

Вот что я в итоге сделал. Отправной точкой является ветка "master", синхронизированная с svn, со всеми моими локальными патчами сверху.

  1. Создать новую ветку (wip = Работа в процессе).

    git branch wip 
    

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

  2. Удалите ненужные локальные патчи с «мастера» с ребазой:

    git rebase -i HEAD~10
    
  3. Теперь в ветке "master" есть патчи, которые вы можете безопасно зафиксировать:

    git svn dcommit
    

    В ветке "wip" теперь есть основные изменения, которые еще не готовы для обмена. На самом деле, я хочу, чтобы они остались там, и именно здесь я бы остановился . Можно выполнить svn dcommit из ветви "wip", как только все будет завершено. Но ради полной законченности и для ответа на первоначальный вопрос есть последний шаг:

  4. Верните незафиксированные изменения обратно в "главную" ветвь, используя git cherry-pick, и, наконец, удалите бесполезную ветвь с git branch -d wip.

2 голосов
/ 13 июня 2009

С git вы не должны работать с одиночными ревизиями. Лучший подход, который я знаю, - это создавать локальные филиалы для любой нетривиальной работы. Таким образом, ваши непроверенные основные изменения окажутся в разных ветках вашего git-репозитория, и вы сможете легко отличить их.

Если это проблема, которая у вас есть в данный момент, вы, вероятно, можете создать новую ветку из точки, которую вы в последний раз обновили из svn, а затем использовать git-cherry-pick , чтобы перенести ваши простые исправления ошибок в эта новая ветка, из которой вы можете затем перейти на svn.

С более долгосрочной точки зрения лучше иметь собственную "основную" ветвь, сделанную из ствола Subversion, а затем либо:

  1. Перебазируйте все свои ветки каждый раз, когда вы обновляете svn, затем объединяйте те, которые вы хотите получить, в svn со своим мастером и оттуда комментируйте.
  2. Слияние вещей из SVN с помощью обычного git-merge , а затем объединение вещей с вашим мастером для dcommits на git diff ..my_branch | patch -p1, что исключит историю, с которой git-svn не может справиться. Этот подход более сложен для окончательного слияния, но позволяет вам объединять вещи между ветвями (и, возможно, другими людьми) в самом git.
...