Pergunta

estamos usando git-svn para gerenciar ramos de um repo SVN. Estamos enfrentando o seguinte problema: depois de uma série de commits por usuário X no ramo, o usuário Y gostaria de usar git-svn para mesclar as alterações no ramo ao tronco. O problema que estamos vendo é que a mensagem de confirmação para todas as operações de mesclagem individuais olhar como se eles foram feitos pelo usuário Y, enquanto a mudança real no ramo foi feita pelo usuário X.

Existe uma maneira para indicar ao git-svn que ao mesclar, use o original mensagem de commit / autor para uma dada mudança em vez da pessoa que faz a fusão?

Foi útil?

Solução

A página man git-svn recomenda que você não usar mala . "" É recomendável que você executar git-svn fetch e rebase (não puxar ou fusão) "". Dito isto, você pode fazer o que quiser: -)

Existem 2 problemas aqui. Primeiro é que svn armazena apenas o commiter , e não o autor de um patch como git faz. Então, quando Y compromete as fusões para tronco, svn registra apenas o nome dela, mesmo que as manchas são de autoria de X. Este é um incrível recurso de git, incrivelmente simples, mas vital para projetos de código aberto foram atribuindo alterações para o autor pode evitar problemas legais no caminho.

Em segundo lugar, git parece não usar os relativamente novos recursos svn mesclagem. Esta pode ser uma coisa temporária, como git é desenvolvido ativamente e novos recursos são adicionados o tempo todo. Mas, por agora, não usá-los.

Eu apenas tentei com git 1.6.0.2 e "perde" informações comparado a fazer a mesma operação com svn merge. No SVN 1.5, um novo recurso foi adicionado aos métodos de registro e anotação, de modo que -g svn log no tronco saída seria algo parecido com isto para uma mala:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

Aqui, Y compromete R5, que incorpora as alterações de X no ramo no tronco. O formato do log que não é realmente grande, mas vem em seu próprio na -g culpa svn:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

Aqui assumindo Y apenas se compromete com tronco, podemos ver que uma linha foi editted por X (no ramo) e fundiu-se.

Então, se você estiver usando svn 1.5.2, você é possivelmente melhor de fusão com o cliente svn real para agora. Embora você perderia informações de intercalação no git, é suficiente geralmente inteligente para não reclamar.

Update: Eu apenas tentei isso com git 1.7.1 para ver se houve qualquer avanço nesse ínterim. A má notícia é que a fusão dentro git ainda não preenche o svn: valores mergeinfo, então git merge seguido por git svn dcommit não irá definir svn: mergeinfo e você perderá informações de mesclagem se o repositório Subversion é a fonte canônica, o que provavelmente é. A boa notícia é que git svn clone não lido em svn:. Propriedades mergeinfo para construir uma história melhor merge, por isso, se você usa svn merge corretamente (que exige a fusão ramos completos), então o clone git vai olhar correto para os usuários git

Outras dicas

Você pode usar enxertos para git ensina sobre fusões que não são denotados no cometem objeto em questão.

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

Encontrar esta informação é bastante fácil: dada encontrar o merge comprometer em questão, você sabe $merge_sha1 e $parent1_sha1 já. Convencionalmente, a mensagem de tal COMMIT irá conter o número SVN revisão do segundo pai cometer, que você simplesmente traduzir para o correspondente cometer ID:

git svn find-rev r$revnum $branch

Presto, você tem todas as 3 peças de informação que você precisa para criar o enxerto.

Tente utilizar o --add-autor-da e --use-log-autor opções para git-svn.

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