Как сохранить svn: внешний, обновленный с помощью git -svn? - программирование
Подтвердить что ты не робот

Как сохранить svn: внешний, обновленный с помощью 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?

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Я написал короткий script, который проверяет все 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
}

Ответ 5

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

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

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

Ответ 6

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

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

Удачи.

Ответ 7

попробуйте этот питон script https://bitbucket.org/nytmyn/gitsvnext/overview

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

python /../gitsvnext/run update

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

python /../gitsvnext/run list

Ответ 8

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

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

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

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

Далее я просто проверяю только внешние (я помещал в инструменты PATH cygwin):

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