Часткові зв’язки із підривом


104

З огляду на випадок я вніс дві незалежні зміни в один файл: напр. додав новий метод і змінив інший метод.

Я часто не хочу вносити обидві зміни як одне зобов'язання, а як два незалежні комісії.

На репозиторій я хотів би використовувати в інтерактивному режимі з GIT-доповнення (1) , щоб розділити шматок на більш дрібні:

 git add --patch

Який найпростіший спосіб зробити це за допомогою Subversion? (Можливо, навіть за допомогою плагіна Eclipse)

Оновлення:
У річ про Git , Райан називає це: "Проблема з заплутаною робочою копією".


Ви шукали конкретно рішення в командному рядку? У багатьох відповідях нижче згадується TortoiseSVN "відновлення після фіксації", що є лише функцією "Черепаха" - настільки GUI та Windows.
флорисла

Відповіді:


35

За допомогою git-svn ви можете створити локальний GIT-сховище віддаленого сховища SVN, працювати з ним за допомогою повного набору функцій GIT (включаючи часткові коміти), а потім перенести все назад у сховище SVN.

git-svn (1)


25
У цьому рішенні є певна іронія.
tuxayo

65

Tortoise SVN 1.8 тепер підтримує це завдяки функції "Відновити після фіксації". Це дозволяє вносити зміни до файлу, після чого всі зміни скасовуються після фіксації

Відповідно до документації:

Ввести лише ті частини файлу, які стосуються однієї конкретної проблеми:

  1. у діалоговому вікні фіксації клацніть правою кнопкою миші файл, виберіть "відновити після фіксації"
  2. відредагуйте файл, наприклад, TortoiseMerge: скасуйте зміни, які ви ще не бажаєте зробити
  3. збережіть файл
  4. зафіксувати файл

Цікаво, як це працює. Я перевірив нотатки до випуску SVN 1.8 , але не можу зрозуміти, на якій основі базується функція "Відновити після фіксації".
DavidS

3
@DavidS Це не особливість SVN. Це особливість TortoiseSVN.
флорисла

FYI, SVN 1.8 - EOL з квітня 2018 року з випуском 1.10
Грег К

Також це можна знайти в документації тут: tortoisesvn.net/docs/release/TortoiseSVN_en/…
Гійом Хуста

42

Я зробив це за допомогою TortoiseSVN .

Вбудована утиліта злиття дозволяє показати різницю між версією сховища та вашою робочою копією.

Використовуйте функцію створення резервної копії утиліти diff

  1. Перейдіть до введення файлу так, ніби ви збираєтесь здійснити всі свої зміни.
  2. У вікні фіксації двічі клацніть файл, щоб показати розм.
  3. У налаштуваннях різниці натисніть опцію для резервного копіювання оригінального файлу .
  4. Клацніть правою кнопкою миші зміни, які вам не потрібні, і виберіть " Використовувати інший текстовий блок" .
  5. Збережіть різницю рівно один раз . Резервна копія буде перезаписана щоразу, коли ви зберігаєте. Ось чому ви хочете зберегти лише один раз.
  6. Здійсніть зміни.
  7. Перезапишіть оригінал створеним файлом .bak (який буде мати всі ваші оригінальні зміни).
  8. Введіть файл.

Тепер ви повинні здійснити всі свої зміни, використовуючи два окремих коміти.


1
Як саме ти це зробив? Мені було б цікаво вивчити цю техніку.
Лассе В. Карлсен

Було б так акуратно, якби це автоматично перезаписало файли .bak після фіксації.
BCS

Я не знайшов варіант крок 3: Резервне копіювання, використовуючи Tortoise SVN 1.8.1
sudhAnsu63

4
Не звертай уваги. Знайдено відповідне посилання для 1.8 tortoisesvn.net/tsvn_1.8_releasenotes.html Щоб виконати лише ті частини файлу, які стосуються однієї конкретної проблеми: у діалоговому вікні фіксації правою кнопкою миші натисніть файл, виберіть "відновити після фіксації" відредагувати файл наприклад, TortoiseMerge: скасуйте зміни, які ви ще не хочете робити, збережіть файл, зафіксувавши файл
sudhAnsu63

На жаль, ця версія для Tortoise 1.8.5, як видається, недоступна, а також "відновлення після фіксації".
kajaco

24

Спробуйте svn diff > out.patchскопіювати, а потім скопіюйте out.patchфайл у out.patch.addтаout.patch.modify

Тільки коли у вас є робочий файл виправлення, відновіть початковий файл за допомогою svn revert out.c.

Відредагуйте файли виправлень вручну, щоб вони містили лише записки для додавання чи зміни. Застосуйте їх до вихідного файлу за допомогою patchкоманди, протестуйте, чи доповнення спрацювало, то svn commitдодавання.

Помивання промивання повторіть для out.patch.modifyпластиру.

Якщо зміни у файлі є окремими, як зазначено в початковому запитанні - додали новий метод, змінили існуючий метод - це спрацює

Це дуже виснажливе рішення, хоча я не переконаний, що у вас є якісь причини розділяти свої зобов'язання.

Ви також могли перевірити кілька робочих копій одного джерела, щоб застосувати свою роботу проти:

svn co http://location/repository methodAdd

svn co http://location/repository methodModify

Будьте впевнені svn upта протестуйте, щоб переконатися, що все добре.


11

Це можливо за допомогою TortoiseSvn (Windows) з версії 1.8.

4.4.1. Діалог діалогу

Якщо ваша робоча копія актуальна і немає конфліктів, ви готові здійснити свої зміни. Виберіть будь-який файл та / або папки, які ви хочете зробити, а потім TortoiseSVN → Здійснити ....

<snip>

4.4.3. Введіть лише частини файлів

Іноді ви хочете ввести лише частину змін, які ви внесли у файл. Така ситуація зазвичай трапляється, коли ви працюєте над чимось, але тоді потрібно терміново виправити, і це виправлення має бути в тому ж файлі, в якому ви працюєте.

клацніть правою кнопкою миші на файлі та використовуйте контекстне меню → Відновити після фіксації. Це створить копію файлу такою, якою вона є. Потім ви можете відредагувати файл, наприклад, у TortoiseMerge та скасувати всі зміни, які ви не хочете робити. Після збереження цих змін ви можете зробити файл.

Після завершення фіксації копія файлу відновлюється автоматично, і ви маєте файл із усіма своїми модифікаціями, які не були виконані назад.

У Linux я б спробував http://webstaff.itn.liu.se/~karlu20/div/blog/2013-05-31_SVNPartialCommit.php . Я не пробував це сам, хоча.


8

Я раніше це робив:

  • У моєму редакторі (я використовую vim) відредагуйте файл так, щоб відобразилася лише одна із змін
  • Збережіть файл (але не виходьте з редактора)
  • Закріпити змінений файл до svn
  • Натисніть "скасувати" в редакторі достатньо разів, щоб знову з'явився другий набір змін
  • Збережіть файл знову
  • Вчиніть другий набір змін.

Це спрощений підхід, який передбачає, що один набір змін досить легко скасувати. У складніших ситуаціях я б відмовився і вчинив обидві зміни, не переживаючи про це.

Тепер, коли я використовую git, це те, що я сподіваюся, що мені більше не доведеться робити це знову!


4

Я використовую або локальний darpo repo, або просто зливаю зміни поступово. Злиття (opendiff відкриває FileMerge, програму злиття, яка постачається з Xcode; замініть улюбленим інструментом злиття):

cp file file.new
svn revert file
opendiff file.new file -merge file

об'єднати пов'язані зміни, зберегти злиття, вийти з програми злиття

svn ci -m 'first hunk' file
mv file.new file
svn ci -m 'second hunk' file

якщо у файлі більше однієї незв'язаної частини, промийте та повторіть (але чому б ви так довго чекали, перш ніж зробити це ?!)

Крім того, якщо ви знаєте git, ви можете використовувати git-svn для підтримки локального git repo та синхронізації ваших зобов'язань з головним сервером svn; чудово працює за мого обмеженого досвіду.


9
Re: "Чому так довго чекати?" Ви робите великий рефактор на цілий день, і начальник скидає трохи виправлення - ось-ось тепер помилка перед обідом.
BCS

4

Спробуйте VisualSVN для Visual Studio . В останньому 6.1 випуску представлена ​​функція QuickCommit. Ви можете частково зафіксувати вибрані зміни у файлі, скориставшись новими командами контекстного меню « Зв’язати цей блок» та « Вибір фіксування» у редакторі Visual Studio.

введіть тут опис зображення


2
  1. Відкрийте всі файли, які ви хочете розділити в редакторі за вибором
  2. Використовуючи інший набір інструментів (у програмі Win, скористайтеся пропозицією Спайка (стара версія)) відкиньте другий набір
  3. Здійснити
  4. поверніться до редактора за вибором і збережіть усі файли

Це трохи ризикованіше, ніж повна пропозиція Спайка, але можна зробити простіше. Також переконайтеся, що ви спершу спробуйте щось інше, оскільки деякі редактори відмовляться зберігати файл, який змінився з-під них, якщо ви не перезавантажите цей файл (втративши всі зміни)


0

Я думаю, що простішим варіантом, ніж створення файлів diff, повернення тощо, було б перевірити дві копії сховища та використовувати візуальний інструмент різниці, як DeltaWalker, для копіювання файлів з одного в інший.

Перша копія була б тією, якою ви насправді працюєте, а друга - саме для цієї мети. Після того, як ви внесли багато змін у перший, ви можете скопіювати один розділ у другий, скопіювати його, скопіювати інший розділ, скопіювати його тощо.


0
  1. Скопіюйте всі модифіковані файли у резервні копії.
  2. Створіть виправлення робочого стану за допомогою svn diff.
  3. Поверніть файли за допомогою svn revert.
  4. Повторно застосуйте частини патча, які ви хочете зробити, або за допомогою patchінструменту, або за допомогою ручного редагування, або будь-якого іншого.
  5. diffПісля цього запустіть, щоб порівняти робочу копію із резервною копією, щоб переконатися, що ви правильно застосували деталі виправлення.
  6. Побудувати та протестувати.
  7. Здійснити.
  8. Скопіюйте резервні копії назад до виїзду в сховище.
  9. Повторіть у 2. (не в 1.!) До завершення.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.