Каковы плюсы и минусы использования git-svn?

Я устал от подрывной деятельности, она продолжает портить собственный репозиторий. Поскольку я долгое время интересовался git и всегда хотел попробовать его, я решил попробовать и использовать git-svn. Но, прочитав документацию, я понял, что с ним нельзя использовать много возможностей git. Вы не можете использовать git-pull, не рекомендуется создавать локальные ветки, и существует масса ограничений. Похоже, это не намного лучше, чем использовать Subversion напрямую. Либо это? Какие плюсы и минусы у git-svn по сравнению с простым svn?

PS. Извините, но я не спрашиваю вас, как исправить мой репозиторий Subversion, мне все равно. Удаление всех .svn и checkout в одном каталоге в одночасье работает нормально. Мне просто было интересно, какие преимущества может дать git-svn.


person vava    schedule 21.08.2009    source источник
comment
У вас действительно не должно быть таких проблем с подрывной деятельностью. Репозиторий Subversion, которым мы управляем на работе, довольно большой (более 10 000 файлов), и у нас никогда не было проблем с его повреждением. Это больше похоже на аппаратную проблему, произвольных повреждений никогда не должно происходить.   -  person Kezzer    schedule 21.08.2009
comment
Думаю, ваш репозиторий не используется непрограммистами :) Они могут сломать все, что угодно.   -  person vava    schedule 21.08.2009
comment
@vava: Непрограммисты могут сломать свою рабочую копию и потерять огромное количество работы, но они определенно не должны иметь возможность сломать репозиторий. Что-то там кажется подозрительным, и на вашем месте я бы попытался выяснить, как это происходит, прежде чем делать что-нибудь еще.   -  person sbi    schedule 21.08.2009
comment
Что ж, им удается сломать рабочие копии других через репозиторий :) Не знаю, как они это делают, но не только я испытываю проблемы.   -  person vava    schedule 21.08.2009
comment
@vava: если проблема в повреждении рабочей копии через репо, git-svn не поможет. Git-svn использует библиотеки Subversion так же, как сервер / клиент Subversion, поэтому, если ошибка находится в коде Subversion (что, как я предполагаю, так и есть), она все равно будет там, когда вы используете git-svn.   -  person JesperE    schedule 21.08.2009
comment
@vava: рабочие области повреждаются, или люди просто вносят изменения, которые сбивают с толку других пользователей (перемещение, переименование и т. д.)? В последнем случае у вас есть проблема с обучением пользователей, а не ошибка Subversion.   -  person JesperE    schedule 21.08.2009
comment
@JesperE, нет, рабочая копия повреждена. Я не уверен, что git-svn поможет, но я могу попробовать, не так ли?   -  person vava    schedule 21.08.2009
comment
Вы используете file: /// для подключения к общему репозиторию?   -  person Bert Huijben    schedule 21.08.2009
comment
@Bert, нет, https: // ... Репозиторий не в моей локальной сети, на самом деле есть большая вероятность, что он находится в другой стране :)   -  person vava    schedule 21.08.2009
comment
@vava: давай, попробуй. Если вы получите еще одно повреждение рабочей копии, по крайней мере, у вас есть еще одна точка данных.   -  person JesperE    schedule 21.08.2009


Ответы (8)


Плюсы:

  • Everything that Git is good for:
    • Network-free access to all old commits
    • Зафиксируйте и переустановите в Git (опять же, без сети), а затем git svn dcommit, чтобы отправить все изменения в SVN для хорошей чистой фиксации
    • Дешевое локальное ветвление (не знаю, почему вы говорите, что это не так хорошо работает)
  • Не нужно так часто иметь дело с SVN :)

Минусы:

  • Намного лучший рабочий процесс, если вы уже знаете и Git, и SVN (т.е. не так хорошо для новых пользователей системы управления версиями)
  • Запутает кого-то еще, если они посмотрят на то, что вы делаете
  • Некоторые функции SVN (например, svn: keywords) недоступны / удобны
person Will Robertson    schedule 21.08.2009
comment
Я вынужден использовать SVN в университете и по-прежнему предпочитаю использовать Git с мостом SVN. Тем не менее, вы не можете полностью использовать преимущества Git, пока SVN не выйдет из уравнения. - person Tate Johnson; 21.08.2009

Это конкретные за и против использования git-svn. Так что дело не в самом мерзавце.

Pro:

Люди, использующие svn, обычно фиксируют большие изменения сразу, потому что вам нужно выполнять фиксацию по сети. Такой подход может быть плохим, потому что иногда изменения могут не быть связаны друг с другом. например: у вас могут быть изменения с исправлениями и изменения для новой функции, зафиксированные в одном наборе изменений. С помощью git я могу как можно чаще фиксировать изменения в моем локальном репозитории git (особенно когда я не подключен к сети) и иметь как можно меньший набор изменений. Затем я передаю svn (используя 'git svn dcommit'), когда все большие изменения готовы.

Против:

Минус использования svn в качестве удаленного репозитория - это слияние, особенно когда есть конфликты. Иногда это может быть болезненно. Я использую IntelliJ в качестве своей IDE, и для разрешения конфликтов мне нужно перейти в командную строку, чтобы исправить это. Зная, что я часто сталкиваюсь с этой проблемой, я задокументировал это, и теперь для меня это больше не имеет большого значения.

person Joshua Partogi    schedule 21.08.2009

Я перешел на git с помощью git-svn. Наш репозиторий svn по-прежнему в рабочем состоянии, и мы по-прежнему получаем все "git awesomeness". По сути, после клона git-svn вы снова разветвляете его как свой «ствол». Отсюда все, кто использует git, ответят. Когда вам нужно получать обновления от svn, вы просто выполняете git-svn rebase, а затем git merge --squash из ветки svn в новый «ствол». И наоборот. Это будет означать, что ваша история в репозитории svn не будет соответствовать содержимому git. Когда вы выполняете более одного слияния, в какой-то момент вам придется начать прививать коммиты, потому что история не совпадает. Однако, если вы привяжете ГОЛОВУ своего ствола git к последнему идентификатору фиксации, который был сжатым слиянием, вы получите тот же эффект.

Хорошо, позвольте мне как можно лучше разобрать это на примере.

svn репо: svn: //xyz.com/myproject

git svn clone svn://xyz.com/myproject

Это должно оставить вас с нормальной настройкой git-svn с основной веткой, которая имеет ту же историю, что и репозиторий svn.

git checkout -b git_trunk

git_trunk становится «стволом» для пользователей git.

Эту ветку можно свободно использовать, как и любой другой репозиторий git.

Теперь вам нужно синхронизировать эти две ветки с помощью git merge --squash

Например .. слияние из ветки master svn на git_trunk

git checkout git_trunk
git merge --squash master
git commit -a 

Вы бы сделали то же самое, чтобы выполнить слияние из git_trunk с главным svn, за исключением того, что вы выполнили бы

git svn dcommit

Это вернет его в svn.

Итак, сложность здесь в том, что, поскольку мы используем --squash, история слияния теряется, и единственный общий предок, о котором когда-либо будет знать git, - это точка ветвления. Это будет означать конфликты слияния. Я решил это, сделав что-то вроде этого

Слияние из git_trunk в master. Сначала я беру идентификатор последнего сквоша на git_trunk. Назовем это ABCDEFG. Затем я получаю фиксацию git_trunk. Допустим, это HIJKLMNO

echo "HIJKLMNO ABCDEFG" > .git/info/grafts

Это сообщит git при слиянии, что наиболее распространенным предком является последний скошенный коммит.

Это не идеально, но для меня это отлично работает. Особенно сейчас, когда почти все пользуются git.

person Community    schedule 23.08.2009
comment
Итак, вы создали общедоступный репозиторий git, который используют все, кому нравится git, и время от времени вы просто фиксируете изменения всех этих людей в основном подрывном репозитории. Бедняги, ушедшие на svn, больше не могут винить :) - person vava; 23.08.2009

Мой опыт работы с git-svn заключается в том, что он в первую очередь полезен (опытным) пользователям git, которые хотят иметь git-подобный интерфейс для репозитория Subversion. Усвоение набора концепций git и ограничений git-svn было слишком много, по крайней мере для меня.

Если можете, я бы порекомендовал вам полностью перейти на git.

Я видел много людей, жалующихся на Subversion, но, насколько мне известно, она довольно стабильна. Вы уверены, что у вас нет проблем с оборудованием?

person JesperE    schedule 21.08.2009
comment
Да, я уверен :) Просто иногда он ломается, когда имена файлов слишком длинные или когда соединение выходит из строя в середине фиксации. Работать с репозиторием на 2 ГБ просто непросто для плохой подрывной деятельности. Жаль, что я не могу полностью переключиться на git. - person vava; 21.08.2009
comment
Вы просили помощи в списках рассылки SVN? Бьюсь об заклад, они бы очень заинтересовались такими вопросами. - person sbi; 21.08.2009
comment
Думаю, им будет интересно в любом случае. Коррумпированный репозиторий - это ошибка, которую разработчики Subversion воспринимают ОЧЕНЬ серьезно, ИМО. И, кстати, с репо на 2GB проблем быть не должно вообще. У нас есть сервер 50+ репозиториев с общим размером ~ 50 ГБ. (И использование git-svn не поможет вам, если Subversion повреждает репо.) - person JesperE; 21.08.2009
comment
Я могу вам сказать, что размер - это не вопрос подрывной деятельности. Я работаю с множеством репозиториев размером от 10 до 20 Гбайт. И длинные имена файлов - проблема только в глубоко вложенных рабочих копиях. Однако все файловые системы имеют эти ограничения (путь может состоять только из 255 символов). - person Peter Parker; 21.08.2009
comment
Да, я знаю об ограничении размера пути. Я просто ненавижу, когда Subversion может загружать файл без каких-либо проблем, но не может создавать свои собственные метаданные, потому что путь к нему немного длиннее, а затем отказывается обновлять и фиксировать любые другие файлы из-за этого. Это действительно раздражает. - person vava; 21.08.2009
comment
@Peter: 255 - это не предел размера универсального пути. В Windows MAX_PATH на самом деле составляет 260 символов, а ext2 / ext3 имеет гораздо больший предел пути, чем это. - person JesperE; 21.08.2009

Если использование:

  • «У нас есть SVN, но есть Git для быстрого внутреннего ветвления», нет необходимости использовать git-svn: вы можете 'git init' прямо в ветке вашего рабочего пространства Subversion и git hack прямо в этой части вашего кода.

Но если это:

  • "We maintain both a central SVN repo and a Git repo", then things are bit more complicated, because:
    • a simple git-svn will reproduce the "SVN branches" (actually simple directory with copies in it), so I would recommend using svn2git and git2svn
    • попытка импортировать все в один репозиторий Git не всегда является хорошей идеей (см. "Каковы ограничения git?"): если ваша система состоит из разных модулей, которые можно разрабатывать независимо друг от друга, они могут находиться в одном центральном репозитории SVN, но должны иметь свой собственный Git репо (чтобы вытащить только нужные вам модули)
person VonC    schedule 21.08.2009

Думаю, переход на git не решит ваших проблем. Если у вас есть «непрограммисты» внутри вашей рабочей силы, и они сломают рабочую копию других людей (я предполагаю, переименовав / удалив каталоги или файлы).

Если вы будете использовать git-svn или git или любую другую VCS, а люди по-прежнему переименовывают / удаляют свои каталоги, как это должно стать лучше?

Я думаю, вам следует попытаться научить некоторых людей понимать основные концепции VCS.

Если люди не понимают рабочих процессов SVN, я сомневаюсь, что они справятся с git-svn или git.

person Peter Parker    schedule 21.08.2009
comment
Вот почему я хочу спрятаться за git-svn :) Я не знаю этого наверняка, но мне хотелось бы думать, что git просто более продвинутый и не сломается так легко. - person vava; 21.08.2009
comment
git-svn внесет больше сложности и сломается так же легко, как svn, если вы удаляете и переименовываете файлы дико и пытаетесь объединиться. Вам действительно стоит поискать источник ваших проблем. - person Peter Parker; 21.08.2009

Я не вижу проблем, чтобы перенести весь репозиторий svn в git, сохранив в нем историю и все остальное, а затем полностью переключиться на git.

2Гб - это много для одного репозитория. Может, стоит разбить его на несколько частей?

person Vestel    schedule 21.08.2009
comment
К сожалению, я не единственный сотрудник :) И эти люди, не являющиеся программистами, до некоторой степени могли понять Tortoise SVN, git был бы слишком суров с ними. Так что переход на git, к сожалению, не вариант. - person vava; 21.08.2009

Том Престон-Вернер, Крис Ванстрат и Скотт Чакон - Git, GitHub и социальное кодирование: http://developer.yahoo.com/yui/theater/video.php?v=prestonwerner-github

person Community    schedule 21.08.2009