Як відмовитись від місцевих змін у касі SVN?


197

Я хотів би представити диф для огляду, для проекту з відкритим вихідним кодом.

Я отримав код за допомогою SVN (з терміналу, Ubuntu). І я зробив незначні зміни в декількох файлах. Зараз є лише одна зміна, яку я хочу внести. Решта змін, які я внесла, були для налагодження, і більше не потрібні.

Я створив різний, використовуючи svn di > ~/os/firstdiff.diff

Отже, моє запитання: Як відмовитись від місцевих змін?

Чи є спосіб SVN це зробити? Якщо ні, мені доведеться перейти до кожного файлу та видалити всі мої зміни. Тоді я б створив нову різницю і подав її.

Відповіді:


253

Просто використовуйте svn revertкоманду, наприклад:

svn revert some_file.php

Це (як і будь-яка інша команда svn) добре задокументовано на ресурсі svnbook або man-сторінці, або навіть із svn helpкомандою.


2
За винятком того, що Виняк, можливо, захоче зберегти свої місцеві нецікаві зміни для себе.
Базиль Старинкевич

2
@BasileStarynkevitch: Я знову прочитав питання, і схоже, що інші зміни не потрібні: "" "Решта змін, які я внесли, були в основному налагодженнями і більше не потрібні." "" :)
Седрик Жульєн

1
Так ... але він міг би хотіти тримати їх далі для себе ... (Його питання можна зрозуміти обома способами).
Базиль Старинкевич

193

Потрібно відновити всі зміни за допомогою команди повернення svn :

  • Відновити зміни до файлу: svn revert foo.c
  • Відновити весь каталог файлів: svn revert --recursive .

1
посилання на svn 1.1 трохи старе, незважаючи на те, що це перше посилання, яке надає google ;)
Седрик Жульєн

Мабуть, деякі символи у вашому імені файлу можуть ігноруватися. наприклад, icon@2x.png. svn revert icon@2x.png. svn каже, що пропустив "Ікону".
topwik

1
Це найкраща відповідь. Це слід перевірити.
rickfoosusa

12
svn revert --recursive .Допомагає мені багато .
Пол Варгас

Це має бути прийнятою відповіддю, оскільки --recursiveпараметр повертає будь-які локальні зміни, і це питання.
arueckauer

15

Щоб скасувати локальні зміни в одному конкретному файлі:

$ svn revert example_directory/example_file.txt

Щоб скасувати локальні зміни в одній конкретній папці:

$ svn revert -R example_directory/

7

Простих svn revertвистачило на оригінальний плакат. Однак простий svn revertне зробить у більш загальному випадку, коли ви

  1. у вас є редагування, якими ви хочете поділитися, і такі , які ви не хочете ділитися в одному файлі ,
  2. мати місцеві зміни, які ви все ще зацікавлені в збереженні для своєї приватної вигоди .

@ Пропозиція ErichBSchulz використовувати git add -pдуже розумно і набагато загальніше застосувати в такому випадку. У відповіді просто бракувало деяких деталей. Якщо припустити, що ваш поточний каталог - це каталог, в який ви хочете зробити патч, який можна поділити, ви можете зробити щось подібне:

  1. Отримайте незайману версію від субверсії в інший каталог (виберіть ім'я каталогу, яке не існує, тут, використовуючи підкаталог TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Використовуючи цю незайману версію svn як основу, введіть сховище git, ігноруючи каталоги .svn; передайте все у голові svn у своє тимчасове сховище git

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Скопіюйте недавно підготовлені метадані репозиторію git у свій вихідний робочий каталог; Оскільки каталог незайманої підривної каси не потрібен, ви можете позбутися від нього. Тепер ваш робочий каталог - це сховище git та subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Тепер ви можете використовувати потужні та зручні git add -pдля інтерактивного вибору саме те, що ви хочете поділитися, та закріпити їх у своєму сховищі git. Якщо вам потрібно додати файли до комісії, зробіть це також git add <file-to-add>ранішеgit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Використовуючи фіксацію, підготуйте виправлення, яким ви хочете поділитися. З цією метою ви також можете використовувати git diff HEAD^..HEADабо git format-patch(останні можна використовувати безпосередньо для підготовки електронних листів, що надсилаються, що містять патч або кілька патчів):

    $ git show -p HEAD > my-mighty-patch.patch
    

Щоб позбутися метаданих git, просто зробіть rm -rf .git/. Якщо ви плануєте продовжувати злому з оригінальним робочим каталогом, ви можете продовжувати використовувати gitдля керування своїми локальними змінами. У цьому випадку ви, мабуть, отримаєте вигоду від інвестицій, як навчитися користуватися git svn.

Примітка: Якщо ви знайомі з gitцим, це досить тривіальна річ імпровізувати. Інакше це виглядає, можливо, трохи безладно. Ви можете узагальнити підхід, написавши скрипт із цих кроків, щоб реалізувати "інтерактивну фіксацію" або "створення інтерактивного патчу" для svn, який можна використовувати без будь-якого розуміння git.


3
Дуже дякую за анонімний -1, без будь-яких пояснень. У будь-якому випадку я потребував часу, щоб покращити відповідь, уточнивши, коли такий підхід має сенс.
FooF

2
Дуже дякую Фуфу за розширення. +1 від мене! Не хвилюйся. Жорстка натовп.
ErichBSchulz

1
Дякую за великі пальці вгору, @ErichBSchulz! Повільно ми робимо світ кращим для життя, незважаючи на супротивників !!! ;-)
FooF

4

Ви можете використовувати

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

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

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


+1 Це найкраще рішення проблеми, але в цьому випадку я дуже хотів позбутися всіх своїх змін. Звичайно, я не хотів би постійно revertзмінювати свої зміни. Тож я б використовував твій шлях у майбутньому.
Vinayak Garg

3

Перейдіть до кореня цього сховища та запустіть наступну команду

svn revert --depth=infinity .

1
svn revert -R .може бути коротше
jesjimher

1

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

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