Git format-patch, щоб бути сумісним зі svn?


96

Чи є спосіб отримати патч, створений за допомогою 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


Я не можу змусити його працювати ... чи можете ви опублікувати всі необхідні кроки? Дякую!
Маурісіо Шеффер

1
Привіт Ентоні. Чи не могли б ви змінити прийняту відповідь на відповідь Ніколаса?
Саймон Іст

Я підтримую пропозицію Саймона, оскільки відповідь Ніколаса Сміта прийнятою буде корисною для всіх, оскільки це набагато практичніше.
Альбірео

Відповіді:


90

Мені завжди потрібно шукати в Google, але я знайшов, що це чудово працює (для мене):

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

Здається, це завжди добре для мене працює, і, здається, це найпростіший метод, з яким я стикався.


1
Це канонічний спосіб створення SVN-сумісного патча за допомогою Git. Це має бути позначено як відповідь.
mloskot

--no-pagerбільше не є варіантом для git diff.
naught101

Спочатку він був опублікований без --no-pager, я не впевнений, чому його додали в редагуванні. У мене це в --no-pagerбудь-якому випадку завжди добре працювало .
Nicholas Smith

2
Тільки для конкретного коміту: git diff --no-prefix 056a1ba5140 7d939289b80 >my.patchпрацював для мене (де 056a1ba5140і 7d939289b80є sha-1 попереднього та конкретного коміту в git).
Ед Рендалл,

@ Lilás, це проблема зі SVN. Diffs / patches у SVN ніколи не могли обробляти видалені файли
Toofy


17

Ось допоміжний скрипт для створення різниці щодо останнього набору змін 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.*/===================================================================/"

1
Я виявив, що значення REV є неправильним, якщо ви не працюєте з останньою версією svn. Я виправив його, щоб використовувати git svn infoзамість цього так: REV=`git svn info | grep 'Last Changed Rev:' | sed -E 's/^.*: ([[:digit:]]*)/\1/'`
Себастьян Мартін

1
Це круто! Дуже дякую. Мені довелося внести одну зміну, щоб вона працювала для імпорту моїх латок у тигель "
Риб'ячого ока

10

SVN, ймовірно, не може зрозуміти результат git diff -p, але ви можете вдатися до грубої сили:

  1. Зробіть два клони вашого репо
  2. В одному клоні перевірте свої останні новини
  3. В іншому оформленні клонування все, що еквівалентно svn вгору за течією. Якщо ви запланували заздалегідь, у вас є копія svn вгору за потоком у власній гілці, або ви позначили останню версію svn. Якщо ви не планували заздалегідь, використовуйте дату або gitk, щоб знайти хет git SHA1, який найбільш точно відповідає стану svn.
  4. Тепер обчисліть справжній патч, пробігши diff -rдва клони.

12
Або просто дотримуйтесь порад @ Nicholas-smith та запустіть git diff --no-prefix > somefile.diffсвій репозиторій git і надішліть це будь-якому користувачеві svn, щоб він застосував патч patch -p0 < somefile.diffу корені проекту.
DavidG 06.03.13

10

Subversion <1.6 не підтримує виправлення. Схоже, Subversion 1.7 дозволить застосовувати виправлення, а розширення git / hg до уніфікованої різниці знаходяться в нашому списку TODO.


4

Це справді запит на функцію на початку 2008 року

Тоді Лінус Торвальдс сказав:

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

Ось чому

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

був введений в Git1.5.6 у травні / липні 2008 року (хоча я його не тестував)


0

Переконайтеся, що ваші зміни були здійснені та перебазовані у верхній частині вашої локальної гілки git, з git bash run:

git show --pretty >> myChangesFile.patch


0

Прийнята відповідь, надана Ніколасом, чудово працює, за винятком випадків, коли а) двійкові файли існують у різниці або б) ви працюєте у 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.