Git format-patch для совместимости с SVN? - PullRequest
92 голосов
/ 02 апреля 2009

Есть ли способ получить патч, созданный с помощью git format-patch, для совместимости с SVN, чтобы я мог отправить его в репозиторий SVN?

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

ОБНОВЛЕНИЕ: Хотя в настоящее время не существует ни скрипта, ни собственного git-способа сделать это, мне удалось найти пост в начале этого года о том, как это сделать вручную. Я следовал инструкциям и добился успеха в том, чтобы заставить мои git-патчи работать с svn.

Если бы кто-то мог попытаться написать скрипт, чтобы выполнить это и внести свой вклад в проект git, я был бы очень признателен всем.

http://kerneltrap.org/mailarchive/git/2008/1/15/570308/thread#mid-570308

Ответы [ 8 ]

86 голосов
/ 14 ноября 2012

Я всегда должен гуглить это, но способ, который я нашел, который работает идеально (для меня):

  • Создайте патч с помощью git diff --no-prefix master..branch > somefile.diff, основная и ветвь необязательны, зависит от того, как вы хотите получить свои различия.
  • Отправьте его куда угодно и примените с patch -p0 < somefile.diff.

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

21 голосов
/ 24 марта 2012

Краткий ответ: patch -p1 -i {patch.file}.

Пожалуйста, обратитесь к этому блогу за подробностями: Создание патчей Subversion с помощью git .

17 голосов
/ 30 ноября 2010

Вот вспомогательный скрипт для создания сравнения с последним набором изменений svn и данным коммитом: http://www.mail-archive.com/dev@trafficserver.apache.org/msg00864.html

#!/bin/sh
#
# git-svn-diff
# Generate an SVN-compatible diff against the tip of the tracking branch
TRACKING_BRANCH=`git config --get svn-remote.svn.fetch | sed -e 's/.*:refs\/remotes\///'`
REV=`git svn find-rev $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH)`
git diff --no-prefix $(git rev-list --date-order --max-count=1 $TRACKING_BRANCH) $* |
sed -e "s/^+++ .*/&    (working copy)/" -e "s/^--- .*/&    (revision $REV)/" \
-e "s/^diff --git [^[:space:]]*/Index:/" \
-e "s/^index.*/===================================================================/"
10 голосов
/ 22 декабря 2009

Subversion <1.6 не имеет поддержки патчей. Похоже, что Subversion 1.7 позволит применять патчи, а расширения git / hg для унифицированного diff находятся в нашем списке TODO. </p>

10 голосов
/ 02 апреля 2009

SVN, вероятно, не может понять вывод git diff -p, но вы можете прибегнуть к грубой силе:

  1. Сделайте два клона вашего репо
  2. В одном клоне проверьте свои последние вещи
  3. В другой проверке клона все, что эквивалентно исходному svn. Если вы запланировали заранее, у вас есть копия svn upstream в собственной ветке, или вы пометили последнюю версию svn. Если вы не планировали заранее, используйте дату или gitk, чтобы найти хеш git SHA1, который наиболее близко соответствует состоянию SVN.
  4. Теперь вычислите настоящий патч, запустив diff -r над двумя клонами.
4 голосов
/ 02 апреля 2009

Это действительно запрос функции в начале 2008

Линус Торвальдс сказал в то время:

Так что я бы сказал, что вам нужно что-то более сильное, чтобы сказать "не делайте git diff", и это также должно как минимум запретить обнаружение переименования.
Откровенно говоря, любая программа, которая настолько глупа, что не принимает текущие git-патчи (например, TortoiseSVN), тогда мы, черт побери, не должны просто отключать самую тривиальную ее часть. Мы должны убедиться, что мы не включаем любые из довольно важных расширений:
даже если ToirtoiseSVN будет игнорировать их, если игнорирование их означает, что он неправильно понимает разницу, это вообще не должно быть разрешено.

Может быть поэтому

 git-format-patch: add --no-binary to omit binary changes in the patch.

был представлен в Git1.5.6 в мае / июле 2008 года (хотя я не проверял его)

0 голосов
/ 16 июня 2017

Принятый ответ, предоставленный Николасом, работает нормально, за исключением случаев, когда а) двоичные файлы существуют в diff или б) вы работаете в Windows Git и имеете каталоги с пробелами. Чтобы решить эту проблему, я должен был добавить вложенную команду git diff, чтобы игнорировать двоичные файлы и команду sed, чтобы избежать пробелов. Писать немного громоздко, поэтому я создал псевдоним:

[alias]
svnpatch = "!f() { git diff --name-only --no-prefix master...$1 | grep -Ev \"\\.sdf|\\.Doc|\\.dll|\\.zip|\\.exe\" | sed 's_\\s_\\\\\\\\ _g'  | xargs git diff --no-prefix master...$1 > $1.patch; echo "Created $1.patch"; }; f"

Если вы наберете:

git svnpatch Feature123

... будет создан файл патча Feature123.patch с различиями между базой слияния мастера ветки и ветки Feature123.

0 голосов
/ 24 апреля 2013

Убедитесь, что ваши изменения зафиксированы и перебазированы поверх вашей локальной ветки git, из git bash run:

git show --pretty >> myChangesFile.patch

...