2013-08-02 3 views
7

У меня есть локальный GIT репозиторий, который я создал из SVN репо:Как клонировать git repo со всеми ветвями и тегами из refs/remotes?

$ git svn clone -s svn:... 

Затем я создал резервный пульт и нажал все на него:

$ git remote add backup [email protected]:mybackup.git 
$ git push --mirror backup 

Теперь, когда я пытаюсь клонировать из моя резервная копия, у нее отсутствуют все теги и ветви svn.

$ git clone [email protected]:mybackup.git 
$ cd mybackup 
$ git branch -a 
* master 
    origin 
    remotes/origin/HEAD -> origin/master 
    remotes/origin/master 

Как клонировать репо со всеми тегами и веточками?

Единственный способ, который я нашел это зеркало репо:

$ git clone --mirror [email protected]:mybackup.git 

Это создает локальный mybackup.git каталог, который знает все метки/ветви (можно использовать автодополнение, чтобы получить весь список), но она не является допустимым использовать репо:

$ git checkout mytag 
fatal: This operation must be run in a work tree 

Там должна быть команда вариант линии по-настоящему клонировать репозиторий со всеми ответвления/метки ???

Здесь я нашел несколько связанных вопросов, но ни один из ответов не подходит для этой ситуации. Я предполагаю, что разница в том, что мой клон был создан с --mirror?

+0

Дополнительная информация: Я вижу, что ветви, о которых знает мой новый клон, находятся в директории 'refs/heads' моей резервной копии, в то время как те, которые я не нахожу, находятся в' refs/remotes' (как ни странно, 'backup' также находится в 'refs/remotes' - побочный эффект' --mirror', который я предполагаю). –

ответ

7

есть два способа улучшить вашу команду git clone --mirror [email protected]:mybackup.git Один я нашел это один, зная, что ваша команда создала каталог mybackup.git:

mkdir mybackup 
mv mybackup.git mybackup/.git 
cd mybackup 
git init 

У вас есть полный рабочий каталог.

В качестве альтернативы вы можете прочитать на этой странице: https://git.wiki.kernel.org/index.php/Git_FAQ#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F

git clone --mirror [email protected]:mybackup.git mybackup/.git 
cd mybackup 
git config --bool core.bare false 

Я думаю, что оба эквивалентны с точностью до последней строки, и, вероятно, команда git config --bool core.bare false чище, чем делает git init.

Все это связано с тем, что --mirror создает голый репозиторий, а не рабочий репозиторий, поэтому вам необходимо преобразовать его в рабочий репозиторий.

+0

Спасибо. Выйти из моего решения, поскольку этот, похоже, работает и будет проще. Затем вам нужно только подключить SVN к новому репо и сделать. –

2

После долгих поисков я наконец нашел ответ ...

git clone [email protected]:mybackup.git newdirectory 
cd newdirectory 
git fetch origin refs/remotes/*:refs/remotes/* 
git init 

Теперь git branch -a показывает все мои удаленные филиалы.

Я не уверен, что здесь нужен git init или если он нужен только в варианте git init --bare (см. Пронумерованные строки в сценарии оболочки ниже), но я уверен, что ему ничего не остается, чтобы оставить его в если это не требуется.

Моя главная причина в этом, чтобы получить мою SVN-теги/ветви копируются, а не только при наличии master указывая на SVN trunk и без разбора всей истории SVN (очень медленной для проектов с большим количеством истории, теги и ветви). Таким образом, чтобы скопировать мою информацию SVN:

git svn init -s "svn://mysvnhost/mysvnrepo/myproject" 
git svn fetch 
git checkout master 

Чтобы ускорить этот процесс, я создал скрипт:

#!/bin/sh 
# 
# git-clone-svn-based-repo.sh: 
# 
# clones a git-svn based repo including all SVN commits without pounding 
# the SVN server for hours (just a quick refresh taking seconds) 
# 

usage_exit() 
{ 
    echo "Usage: $0 <git-repo> <dest-directory> <svn-project>" 
    exit 1 
} 


if ! git ls-remote "$1" > /dev/null 2>&1 
then 
    echo "No git repo found at: $1" 
    usage_exit 
fi 

if [ -r "$2" ] 
then 
    echo "File or directory already exists: $2" 
    usage_exit 
fi 

if ! svn ls "$3" 2> /dev/null | grep -q trunk 
then 
    echo "No SVN project found at: $3" 
    usage_exit 
fi 

# create new bare git repo 
mkdir "$2" 
cd "$2" 
git init --bare .git 

# fetch everything from backup 
git remote add backup "$1" 
git fetch backup refs/remotes/*:refs/remotes/* 
git fetch backup refs/heads/*:refs/heads/* 
git fetch backup refs/tags/*:refs/tags/* 

# disable future fetching from backup 
# setup to push all remote refs to backup by default 
git config remote.backup.fetch do_not_fetch_from_backup 
git config remote.backup.push '+refs/remotes/*:refs/remotes/*' 

# initialize git repo to usable (non-bare) state 
git init 

# update SVN references 
git svn init -s "svn://svn.crc-corp.com/carsrepository/$3" 
git config svn.authorsfile $HOME/projects/authors.txt 
git svn fetch 

# update master to current SVN trunk 
git checkout master 
git svn rebase 
# update ignore properties from SVN 
git svn show-ignore >> .git/info/exclude 

Для создания такой резервной копии из существующего мерзавец SVN репо:

# create a bare backup repo at [email protected]:mybackup.git 
git remote add backup [email protected]:mybackup.git 
git config remote.backup.fetch do_not_fetch_from_backup 
git config remote.backup.push '+refs/remotes/*:refs/remotes/*' 
git push backup