SVN diff в 2 разных репозиториях
У меня есть 2 хранилища. Поскольку транковый код находился в одном репозитории, который был защищен, я сделал проверку, а затем зарегистрировался в другом репозитории (поскольку у пользователей не было разрешения на первый защищенный).
Теперь проблема в том, что оба хранилища были обработаны, и мы хотим наконец объединить код / ветвь второго незащищенного с защищенным. Но в них будут конфликты.
Есть ли способ узнать diff для 2 веток хранилища? Кроме того, если есть изменения пробелов, как мне их игнорировать?
9 ответов
Я не знаю встроенной функции subversion, которая позволила бы это, но вы могли бы создать полную проверку обоих репозиториев и использовать утилиту diff командной строки для сравнения обеих рабочих копий:
diff -w -u -r -N WorkingCopy1 WorkingCopy2
-w
игнорировать все пробелы-u
использовать унифицированный формат diff (например, subversion)-r
для рекурсивного-N
чтобы новые файлы появлялись в патче
Это, конечно, не самый быстрый подход, но может быть приемлемым для одноразового процесса. Вы также можете создать патч, перенаправив вывод в файл diff -w -u -r -N WorkingCopy1 WorkingCopy2 > wc1-to-wc2.patch
Если вы используете Windows, сборки win32 diff и patch можно найти здесь: http://gnuwin32.sourceforge.net/packages/diffutils.htm
svn diff --old=URL1@rev1 --new=URL2@rev2
Пример:
svn diff --old=http://svn.whatever.com/trunk/myfile.txt@1234 --new=http://svn.whatever.com/branch/myfile.txt@5678
Это позволяет вам указать как ветви, так и номера ревизий для обоих файлов. Я знаю, что это работает, потому что я только выполнил это.
Лучшим инструментом для этого слияния может быть git-svn. Если URL-адрес двух репозиториев - $ URL1 и $URL2, попробуйте:
$ git svn clone $ URL1 svn1 $ git svn clone $ URL2 svn2 $ cd svn1 $ git fetch../svn2 $ git diff FETCH_HEAD master
Чтобы игнорировать изменения пробелов, используйте git diff -w
Вы можете использовать такой инструмент, как kdiff3, чтобы просто сравнить извлеченные рабочие копии из обоих репозиториев. (Просто укажите его на два каталога, и он рекурсивно сравнит все файлы в них.)
Каждый раз, когда я попадаю в эту ситуацию, я использую Мелд. Это мультиплатформенный инструмент для сравнения GUI. он может сравнить файл с файлом или каталог с каталогом. В вашем случае вы можете оформить оба проекта в отдельные каталоги и использовать их для сравнения. Вы можете очень легко перемещать изменения (линии или блоки) из одного файла в другой.
Дифф тоже хорошо!
Скопируйте второй репозиторий в первый, используя следующее в рабочей копии первого репозитория:
svn cp svn://url/to/the/second/repo branches/second_repo
Проверьте и сделайте регулярное слияние из новой ветки в ваш ствол.
В этом объяснении предполагается, что вы используете наиболее распространенную структуру хранилища SVN (ветки /, теги / и / trunk в качестве каталогов верхнего уровня), и поэтому может потребоваться адаптировать команду копирования.
Также обратите внимание, что некоторые GUI для SVN также поддерживают этот режим копирования. В SmartSVN команда называется "Копировать с URL".
Если вы работаете в Linux, вы также можете использовать инструмент "meld"... Он делает отличные различия, и вы можете легко сделать слияние...
Вероятно, самая простая вещь состоит в том, чтобы проверить обе ветви и использовать такой инструмент, как winmerge (который позволит вам игнорировать пробелы и выполнять многократное сравнение)