Como posso usar dois projetos SVN e git-svn ramos correspondente com um único diretório de trabalho?

StackOverflow https://stackoverflow.com/questions/609872

  •  03-07-2019
  •  | 
  •  

Pergunta

Eu sou relativamente novo para Git, mas eu quero dar-lhe uma tentativa (vs SVN e Bazaar).

Alguém pode me recomendar um fluxo de trabalho para uma situação semelhante à seguinte:

  • 1 SVN repo, com vários projetos
  • 1 cópia de trabalho "src"

O ideea é que em "src" Eu preciso projeto check-out A ou às vezes projetar B. Ambos os projetos têm vários ramos.

Por enquanto, eu fiz 2 clones git do repo SVN, uma para cada projeto. (Eu teria preferido repos --bare, mas ele não funciona com git svn clone)

Então, eu fiz um repositório git em "src", e git remote add projA ..a_repo_git, "git remote add projB ..b_repo_git".

Agora, eu posso ver os dois de "src" usando "remoto git", e eu posso ver seus galhos com "git mostrar remoto proja"

E agora o problema ..

  • Como posso entrar em "src" qualquer um dos ramos em proja / projB?
  • Como posso modificá-los, e, em seguida, ser capaz de empurrá-los de volta (pela primeira vez aos git_repos, ou diretamente para o repo SVN)?
  • É este "fluxo de trabalho" ok, ou você tem uma idéia melhor?

Eu tentei em src: git checkout --track -b work_branch projA branch_in_A e depois de algum fiddleing com "fetch" Eu consegui as coisas. Mas então, eu tive problemas empurrando-o de volta para o a_repo_git, e depois para SVN. Foi principalmente tentativa e erro.

Eu tenho que admitir, eu ainda tenho problemas com filiais remotas! (E eu me perdi quando eu tenho que usar "origin local_branch:origin_branch" ou "origin origin_branch:local_branch", ou "origin origin_branch" ou "origin/origin_branch"! Voltar ao manual do Git para um pouco mais de leitura.)

Foi útil?

Solução

Eu não atualizei a questão, porque nos últimos dias eu era capaz de trabalhar muito agradável e fácil com a ajuda do meu novo repo:)

Aqui está o que eu fiz no final:

Init dois repos SVN no mesmo diretório. (Eu não posso rember neste momento, mas pode ser possível que um "git init" foi feito no mesmo dir, antes:

mkdir src && cd src
(not sure about this: git init)
git svn init --stdlayout --prefix=projA/ -RprojA file:///path/to/svn/repo/A
git svn init --stdlayout --prefix=projB/ -RprojB file:///path/to/svn/repo/B

O "--stdlayout" significa que os repos SVN estão no formato padrão, com tronco, ramos e rótulos no mesmo nível.

O "--prefix" é usado para o nome ramos. Quando fazemos "-a git branch", todos os ramos do SVN do projeto A têm o prefixo "proja" (ex: proja / branch_name_of_A). A mesma coisa é para B.

A opção -R define o nome do repo SVN, dentro do repositório git (é o nome que usamos com git quando referindo-se ao repositório / projeto SVN)

O file: /// caminho é o caminho para o repo SVN, e para o projeto dentro do repo, neste caso. Eu uso "file: //", porque eu usei um repo-lima chata, com nenhum servidor. Estou certo de que ele funcione bem com http: // também, para um servidor SVN.

Após esta etapa, por curiosidade eu tinha uma olhada no arquivo src / .git / config. Os dois comandos acima criados vários "svn-remote" seções, uma para cada projeto (a opção -R), e um genérico chamado "svn". Eu já modificou as entradas, então não será apenas referências aos projetos. Cada referência tinha entradas para o caminho repo (buscar) e para tags / ramos / trunk. Se você olhar para o arquivo, você vai entender o que precisa ser mudado.

Depois disso, eu tenho buscado o conteúdo de cada projeto, usando

git svn fetch projA #the contents of project A repo are downloaded
git svn fetch projB #the contents of project B repo are downloaded

Agora, runnig "-a git branch" exibido todos os ramos das duas repos, eo branch master (local). "Git branch -r" não exibida quaisquer ramos; provavelmente porque eles são "svn-remote" e não "remota"

O atual ramo "mestre" estava apontando para o tronco do segundo projeto. Eu decidi me livrar dele, uma vez que poderia causar problemas quando se muda de um projeto para outro.

Eu criei dois novos ramos para apontar para os troncos de cada projeto, em seguida, removido o ramo "mestre":

git checkout -b master_project_A projA/trunk
git checkout -b master_project_B projB/trunk
git branch -D master

E agora, para o "fluxo de trabalho"; para trabalhar em projeto A:

git checkout master_project_A #switch to project A
git svn rebase #check for any updates on SVN repo
git checkout -b work_on_A master_project_A #create a branch starting from the master of project A

work work work on work_on_A; commit, etc

git checkout master_project_A #go back to master of project A
git svn rebase #check again for any update on SVN repo
git checkout work_on_A #go back to the work branch
git rebase master_project_A #update branch with any changes from the master of project A
git checkout master_project_A #go back to the master of project A
git merge work_on_A #merge to the master of project A the changes from the work branch
git svn dcommit #commit changes to the SVN repo, in trunk, because master_project_A was pointing to its trunk

Se eu quiser fazer check-out um ramo existente a partir do SVN, posso fazê-lo com:

git checkout -b work_on_branch projA/branch_name

work work work

git svn rebase #update any changes from projA/branch_name
git svn dcommit #commit updates back to the branch in the SVN repo

Para o projeto B que posso fazer exatamente o mesmo coisas. No final, eu posso ter o conteúdo do projeto de A ou B no mesmo dir "src", e ter acesso a ambos os projetos no repositório SVN do mesmo repo git! : D

eu ainda não descobrir como criar uma filial local, em seguida, empurre-a para o SVN repo -. Eu estava perto, mas não funcionou

Além disso, pode ser útil saber o "reset" de comando ( "git reset --hard projPrefix / ramo"), mas eu quebrei algumas coisas usá-lo, por isso pode ser melhor deixar isso para outra hora.

Espero que isso ajude alguém!

Cheers, Alex

Outras dicas

Vamos primeiro considerar o caso mais simples de um repo remoto e um repo local.

A remote no local, repo funciona "apenas" como uma referência para o outro repo. Você pode usar fetch para recuperar o controle remoto objetos a sua loja local:

git remote add upstream git://...
git fetch upstream

Agora todos os ramos de upstream podem ser localmente referenciado e trabalhou em usando upstream/branchname. Para realmente trabalhar em uma filial remota, você deve sempre fazer uma filial local que acompanha o ramo remoto:

git checkout -b new_local_branchname upstream/branchname

Agora você pode trabalhar localmente e se comprometer / merge tanto quanto você gosta. Como etapa final, você pode push você alterações de volta para o repositório central. O bit imporant é que AFAIK push só pode fazer fusões fast-forward, que é carregar as alterações e definir o novo chefe. Portanto, você tem de preparar a sua filial local para que as alterações locais começam na ponta do ramo remoto. Você pode usar rebase para alcançar esse ou evitar mudar o repositório central enquanto estiver a trabalhar localmente .

Este descreve o fluxo de trabalho simples entre dois repositórios. Agora, para o caso específico com SVN.

git svn complica o quadro por mais restringindo o tipo de mudanças que você pode fazer. Tal como acontece com controles remotos, você nunca deve modificar diretamente os ramos svn mas sempre trabalhar em um ramo local. Ao contrário de controles remotos, git svn sempre modifica commits como eles vão para o SVN repo para adicionar os metadados necessários. Este último fato é provavelmente a razão para muitos dos seus problemas como commits no ramo SVN terá sempre diferentes hashes dos commits originais sobre suas filiais locais.

Finalmente, sua pergunta sobre vários projetos na mesma repo.

Git não suporta checkouts paralelas de várias ramificações no mesmo repo. Você pode querer olhar para submódulos para integrar múltiplos repos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top