Как поддерживать актуальность svn:external с помощью git-svn?

Рассматривая мой репозиторий как репозиторий SVN, я получаю:

svn co http://myrepo/foo/trunk foo
...
foo/
  bar/
  baz/ -> http://myrepo/baz/trunk

Рассматривая это как репозиторий Git, я получаю:

git svn clone http://myrepo/foo --trunk=trunk --branches=branches --tags=tags
...
foo/
  bar/

Я могу клонировать baz на свою локальную машину в другом месте и добавить символическую ссылку, но это всего лишь хак. Есть ли способ заставить git svn rebase автоматически вносить эти изменения при обновлении всего остального, как это делает svn up?


person James A. Rosen    schedule 08.12.2008    source источник
comment
Я знаю, что где-то читал о том, как настроить это с помощью подмодулей git, но не могу найти ссылку.   -  person JesperE    schedule 23.01.2009


Ответы (8)


Лучшее средство интеграции внешних элементов svn с git-svn, которое я видел, это script, который клонирует ваши внешние файлы в каталог .git_externals/ и создает нужные вам символические ссылки и исключает файлы. Я нахожу это простым и прямым решением. YMMV.

Вот старый обзор других вариантов работы с внешними данными svn с помощью git-svn. Мне они кажутся слишком сложными и могут сломаться при последующем использовании Git.

person Paul    schedule 08.12.2008
comment
Кажется, это не работает для меня (здесь внешние ссылки являются относительными ссылками на один и тот же репозиторий). - person Paŭlo Ebermann; 05.12.2011

Решение, которое я в конечном итоге использовал, заключалось в том, чтобы просто создать символическую ссылку на другие клоны git-svn на моем локальном компьютере. Это сработало довольно хорошо: это позволяет мне зафиксировать изменения обратно и позволяет мне вносить локальные изменения в проект A, чтобы перенести их в проект B.

person Community    schedule 23.01.2009

Я только что написал короткий скрипт, который извлекает все svn:externals из текущих HEAD в корневой каталог и исключает их из репозитория git.

Поместите его в .git/hooks/post-checkout, и он будет обновлять эти внешние проверки при каждом изменении рабочего дерева, например, из-за git svn rebase или git-checkout.

#!/bin/bash
set -eu

revision=$(git svn info | sed -n 's/^Revision: \([1-9][0-9]*\)$/\1/p')
git svn -r${revision} propget svn:externals | head -n-1 | {
    while read checkout_args
    do
        checkout_dirname=$(echo ${checkout_args} | cut -d' ' -f3)
        svn checkout ${checkout_args}
        if [ -z $(grep ${checkout_dirname} .git/info/exclude) ]
        then
            echo ${checkout_dirname} >> .git/info/exclude
        fi
    done
}
person tuomasjjrasanen    schedule 07.11.2011
comment
+1 за то, что почти работает на Windows git. Мне пришлось немного подправить его, но это лучшее решение для Windows. - person pms1969; 05.12.2013
comment
@ pms1969: Источник измененной версии? - person Carl; 14.01.2014

Я также сделал скрипт (доступен как на Perl, так и на Ruby), который делает это за меня, он находится по адресу http://github.com/liyanage/git-tools/.

  • Рекурсивно проверяет все svn:externals
  • Можно запускать повторно, если клон большого репозитория прервется на полпути. Со мной многое случилось. Он поднимается с того места, где остановился.
  • Добавляет все записи svn:externals, которые он находит и обрабатывает, в .git/info/exclude
  • Добавляет все найденные записи svn:ignore в .git/info/exclude
  • Может запускаться регулярно после первого запуска для выполнения svn:rebase во всех клонированных суб-песочницах, обнаружения новых внешних и новых svn:ignores

Обновление: я больше не поддерживаю этот скрипт. Его функциональность для рекурсивного клонирования и обновления репозитория SVN, а также другие функции, связанные с git, доступны в этом новом проекте, который я активно поддерживаю: http://liyanage.github.com/git-tools/

person Marc Liyanage    schedule 09.04.2010
comment
Я хотел бы узнать, что не сработало для вас, чтобы я мог улучшить сценарий. Вы можете связаться со мной? - person Marc Liyanage; 16.08.2010
comment
Там много вилок. Кто-нибудь знает, какой из них работает в Windows с помощью msysgit? Связанная версия просто зависает. - person axk; 02.03.2012
comment
Тоже не смог заставить работать. Документация кажется несинхронизированной. gh clone-externals не распознается как допустимая подкоманда. - person Plouff; 30.06.2016

Просто для протокола: я последовал этому предложению и попытался использовать SmartGit для работы с svn:externals.

SmartGit — лучший клиент с графическим интерфейсом, который я когда-либо видел для Git. Что касается svn:externals, то он не только корректно извлекает их, но и предоставляет возможность сделать «быстрый снимок» (клон только для чтения, клон только для HEAD) внешних репозиториев.

К сожалению, это не бесплатно для коммерческого использования (и я нашел цену лицензии немного завышенной - да, я скряга). Однако его можно использовать бесплатно в некоммерческих целях.

person rsenna    schedule 21.01.2013

Я решил написать «простой» Perl-скрипт, чтобы справиться со всем этим за меня. Недавно выложил на гитхаб, попробуйте, может поможет: http://github.com/sushdm/git_svn_externals/.

По сути, он выполняет клонирование git-svn для всех найденных внешних элементов и ищет их рекурсивно, клонирует, создает символические ссылки в нужных местах и ​​исключает все каталоги и символические ссылки .git_externals, чтобы вы все еще могли использовать «git svn dcommit».

Удачи.

person Dmitry    schedule 18.08.2009

попробуйте этот скрипт Python https://bitbucket.org/nytmyn/gitsvnext/overview

чтобы проверить внешний вид svn, выполните следующие действия в вашем репозитории git

python /../gitsvnext/run update

запустите это, чтобы узнать, что поместить в .git/info/exclude

python /../gitsvnext/run list
person opekar    schedule 10.03.2012
comment
В какой папке вы бы запустили это? Если мой основной репозиторий svn — это /path/to/repo, а внешние файлы определены внутри /path/to/repo/myexternals/folder/, то должен ли я запускать скрипт внутри /path/to/repo или myexternals/folder? - person Bibek Shrestha; 04.01.2013

Вот что я сделал.

Сначала я создал пустой репозиторий SVN (для того же корня, что и git):

svn checkout --depth empty http://path/to/repo .

Это создало пустой репозиторий svn в корневом каталоге git. Дело в том, что он содержит внешние свойства SVN.

Затем я просто проверяю только внешние элементы (я поместил их в PATH cygwin tools):

svn propget svn:externals | sed -e 's/ / .\//' | sed -e 's/\'//g' | xargs -L1 svn co
person TCS    schedule 03.08.2015