2013-08-02 12 views
7

Mam lokalnego git repo, że stworzony z repo svn:Jak sklonować repozytorium git ze wszystkimi gałęziami i tagami z refs/pilotów?

$ git svn clone -s svn:... 

Potem stworzył backup zdalny i pchnął wszystko do niego:

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

Teraz, gdy próbuję sklonować z moja kopia zapasowa, brakuje wszystkich tagów i gałęzi svn.

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

Jak mogę sklonować repozytorium ze wszystkimi tagami i oddziałami?

Jedynym sposobem znalazłem to lustro repo:

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

Stwarza to lokalny katalog mybackup.git, który wie o wszystkich tags/oddziałów (mogę używać zakończenie kartę, aby uzyskać pełną listę), ale nie jest to poprawne repozytorium:

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

Musi istnieć opcja wiersza poleceń, aby sklonować repozytorium ze wszystkimi gałęziami/znacznikami ???

Znalazłem kilka powiązanych pytań tutaj, ale żadna z odpowiedzi nie działa w tej sytuacji. Zakładam, że różnica polega na tym, że mój klon został utworzony z --mirror?

+0

Więcej informacji: Widzę, że gałęzie, o których wie mój nowy klon, znajdują się w katalogu 'refs/heads' mojej kopii zapasowej, podczas gdy te, których nie znajduję, znajdują się w' refs/pilotach' (co dziwne, 'backup' jest również w 'refs/remote' - efekt uboczny' --mirror', który zakładam). –

Odpowiedz

7

Istnieją dwa sposoby, aby poprawić swoją komendę git clone --mirror [email protected]:mybackup.git jeden znalazłem jest to jeden, wiedząc, że komenda stworzyła katalog mybackup.git:

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

Tam masz pełny katalog roboczy.

Ewentualnie jak można przeczytać na tej stronie: https://git.wiki.kernel.org/index.php/Git_FAQ#How_do_I_clone_a_repository_with_all_remotely_tracked_branches.3F

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

Myślę, że obie są równoważne do ostatniego wiersza, a prawdopodobnie komenda git config --bool core.bare false jest czystsze niż robi git init.

Wszystko to składa się na fakt, że --mirror tworzy repozytorium, a nie działające repozytorium, więc trzeba go przekształcić w działające repozytorium.

+0

Dzięki. Wycofuję moje rozwiązanie, ponieważ ten wydaje się działać i być prostszym. Następnie wystarczy podłączyć SVN do nowego repozytu i zrobić. –

2

Po wielu poszukiwaniach w końcu znalazłem odpowiedź ...

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

Teraz git branch -a pokazuje wszystkich moich odległych oddziałów.

Nie jestem pewien, czy potrzebne jest tutaj , czy jest to potrzebne tylko w wariancie git init --bare (patrz skomentowane wiersze w skrypcie powłoki poniżej), ale jestem pewien, że nic nie szkodzi, aby zostawić go w jeśli nie jest to konieczne.

Moim głównym powodem jest to, aby moje znaczniki SVN/gałęzie zostały skopiowane zamiast tylko mieć master wskazujące na SVN trunk i bez konieczności analizowania całej historii SVN (bardzo powolne w przypadku projektów z dużą ilością historii, znaczników i gałęzie). Tak aby skopiować moje informacje SVN:

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

Aby przyspieszyć ten proces, stworzyłem skrypt:

#!/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 

W celu utworzenia takiej kopii zapasowej z istniejącego SVN git repo:

# 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 
Powiązane problemy