Как сохранить 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 ответов:
лучший способ интеграции внешних 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