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


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

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

рассматривая его как Git repo, я получаю:

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

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

8 51

8 ответов:

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

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

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

Я только что написал короткий скрипт, который проверяет все 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]*\)$//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
}

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

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

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

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

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

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

Я решил написать" простой " скрипт perl, чтобы справиться со всем этим для меня. Я недавно поставил его на github, попробуйте, может быть, это поможет:http://github.com/sushdm/git_svn_externals/.

Он по существу делает клон git-svn для всех найденных внешних объектов, и он ищет их рекурсивно, клонирует, символически связывает их в нужных местах и исключает все .git_externals dirs и символические ссылки, так что вы все еще можете использовать "git svn dcommit".

удачи.

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

для проверки внешних svn выполните следующие действия в вашем репозитории git

python /../gitsvnext/run update

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

python /../gitsvnext/run list

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

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

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

это создало пустое РЕПО svn в корне git. Дело в том, что он содержит свойства svn externals.

далее я просто проверяю только внешние (я разместил в пути cygwin tools):

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