Close

Trabalhando com Git e Perforce: fluxo de trabalho de integração

Então, este é o cenário: sua equipe trabalha com independência em um repositório do Git, mas uma parte da empresa ainda usa o Perforce para gerenciar partes da mesma base de código. Essas equipes no Perforce não estão planejando migrar, mas sua equipe já fez a transição para o Git (por muitos bons motivos). É importante que você possa manter um processo de compartilhamento de código bidirecional em andamento entre as bases de código para que as melhorias desenvolvidas em qualquer versão possam ser compartilhadas, de preferência sem custar muito tempo ou atolar demais sua equipe.

É aqui que entra este guia. Na TomTom, essa operação de sincronização é feita uma vez a cada novo lançamento — o que, no caso deles, acontece uma vez a cada mês e meio.

-- Este post foi escrito em colaboração com Andrea Carlevato, Adolfo Bulfoni e Krzysztof Karczewski, que tiveram a gentileza de compartilhar o processo do Git usado na unidade de aplicativos de navegação da TomTom. --


Suposições antes de começarmos


Vamos supor que você já está familiarizado com o uso básico do Git e familiarizado com um fluxo de trabalho de ramificação de função. Caso contrário, reserve um tempo para assistir a um tutorial prático ou a um webinar. Volte quando estiver pronto, vamos esperar.

Como existem algumas sutilezas a serem lembradas no processo, sugerimos ter muito cuidado ao realizar essas integrações. Vamos nos aprofundar quando você estiver pronto!

Instalando o git p4


O primeiro passo é instalar a ponte. Verifique se você já a instalou digitando em uma linha de comando:

git p4

Se o sistema reclamar que o git p4 não está instalado, baixe git-p4.py e coloque-o em uma pasta em seu PATH, por exemplo ~/bin (obviamente você vai precisar que o Python também esteja instalado para que ele funcione).

Torne-o executável com:

chmod +x git-p4.py

Edite o arquivo ~/.gitconfig adicionando:

[alias]
    p4 = !~/bin/bit-p4.py

Em seguida, execute o git p4 de novo e você não vai receber erros. A ferramenta está instalada.

bancos de dados
Material relacionado

Como mover um Repositório do Git completo

Logotipo do Bitbucket
VER SOLUÇÃO

Aprenda a usar o Git com o Bitbucket Cloud

Visão geral do fluxo de trabalho


Clone inicial

Como os projetos no P4 podem desenvolver histórias enormes, a equipe pode escolher um ponto de corte para sincronizar, economizando muito espaço e tempo. O git p4 permite que você escolha a lista de alterações a partir da qual iniciar o rastreamento:

git p4 clone //depot/path/project@<earlier-cutoff-point>,<latest-changelist>
  • Agora podemos executar uma sincronização e verificar se recebemos todos os conjuntos de alterações no local:
git p4 sync

O comando sync encontra novas alterações no P4 e as importa como commits do Git.

  • A ramificação que vamos usar para interagir direto com o Perforce é nomeada p4-integ. Neste ponto, queremos apenas ramificá-la do remotes/p4/main:
git checkout -b p4-integ origin/p4/main

Sincronização rápida de acompanhamento (também conhecida como "atrair e trocar")

Após a conclusão da primeira importação, as sincronizações subsequentes do git-> p4 podem ser feitas com os seguintes comandos:

git checkout p4-integ
git p4 sync

O de cima funciona, mas pode ser lento. Uma maneira muito mais rápida de executar a sincronização é recriar referências idênticas às usadas na integração mais recente. Essa também é uma maneira interessante de garantir que qualquer novo desenvolvedor encarregado da integração comece na lista correta de commit/alteração.

Veja como fazer isso:

  • Remova as referências originais antigas (ou obsoletas) do remoto p4 (opcional):
git symbolic-ref -d refs/remotes/p4/HEAD
git update-ref -d refs/remotes/p4/main
  • Crie referências remotas artificiais (também conhecidos como falsas) que apontam para o último commit no p4-integ na origem:
git update-ref refs/remotes/p4/main remotes/origin/p4-integ
git symbolic-ref refs/remotes/p4/HEAD refs/remotes/p4/main

A única desvantagem dessa sincronização muito mais rápida é que precisamos especificar explicitamente a ramificação no git p4. Então, este é o comando final:

git p4 sync --branch=refs/remotes/p4/main

A maneira como o git p4 rastreia o mapeamento entre os IDs de commit do Git e os P4 é anotando os commits com metadados:

Merge pull request #340 in MOB/project from bugfix/PRJ-3185 to develop

    Squashed commit of the following:

    commit c2843b424fb3f5be1ba64be51363db63621162b4
    Author: Some Developer
    Date:   Wed Jan 14 09:26:45 2015 +0100

        [PRJ-3185] The app shows ...

    commit abc135fc1fccf74dac8882d70b1ddd8a4750f078
    Author: Some Developer
    Date:   Tue Jan 13 14:18:46 2015 +0100

        [PRJ-3185] The app shows the rating ...

    [git-p4: depot-paths = "//depot-mobile/project/": change = 1794239]

Observe que em uma versão mais recente do git p4, os metadados para associar um commit do Git a uma lista de alterações P4 são armazenados em uma nota de commit e não na mensagem do commit. A equipe da TomTom não gostou da mudança porque deu um pouco mais de trabalho verificar os números da lista de alterações quando necessário.

Mover as alterações do git para o Perforce


Depois que a operação de sincronização rápida acima for concluída, agora você está pronto para fazer push das alterações do git para o Perforce.

O primeiro passo é fazer o rebase do p4-integ com as alterações provenientes do remotes/p4/main:

git checkout p4-integ
git p4 rebase

Depois disso, todas as novas alterações do Perforce devem estar no p4-integ para que possamos atualizar o principal:

  • Depois disso, você pode apenas:
git checkout main
git merge develop
  • Tenha as tags mais recentes no local:
git fetch --tags
  • Use uma limpeza temporária caso você precise remover os commits já em P4 (consulte a tag P4 no commit). Caso nenhum commit deva ser ignorado, um rebase automático que vai linearizar o histórico:
git checkout -b cleanup #branching off from main
git rebase -s recursive -X theirs tag/last-p4-integ
  • Usando um rebase interativo, essa ação pode ser feita com:
git rebase -i tag/last-p4-integ
  • Use cherry-pick para escolher os novos commits e colocá-los na ramificação p4-integ. Fazemos dessa maneira porque não fazemos suposição de que as ramificações git principal e desenvolvimento possam ser mantidas como ancestrais próprias da ramificação p4-integ. Na verdade, na TomTom, esse não é mais o caso.
git checkout p4-integ
git cherry-pick tag/last-p4-integ..cleanup
  • Envie para P4 e sincronize p4-integ:
git p4 submit
git p4 sync --branch=refs/remotes/p4/main
git reset --hard refs/remotes/p4/main
  • Excluir ramificação de rebase temporária:
git branch -D cleanup
  • Remova o ponteiro para o ponto de integração mais recente (tag) no local e no remoto:
git tag -d tag/last-p4-integ
git push origin :refs/tags/tag/last-p4-integ
  • Atualize a tag last-p4-integ para apontar para o novo ponto de integração em P4:
git checkout develop
git tag -a tag/last-p4-integ -m "tag pointer to last develop commit integrated with p4"
git push origin main
git push origin tag/last-p4-integ
git push origin p4-integ

Execute testes na base de código P4 para verificar se a integração não apresentou problemas.

Mover as alterações do Perforce para o git


Isso deve ser feito depois que o push git->P4 já tiver sido feito. Depois que os testes forem bem-sucedidos no P4, agora podemos mover as alterações de P4 para git com o seguinte:

git checkout p4-integ
git p4 sync --branch=refs/remotes/p4/main
git p4 rebase
  • O que vem a seguir é um pequeno truque para executar uma estratégia robusta de merge "deles", esmagando as alterações recebidas em um único commit. Então aqui vai:
git checkout -b p4mergebranch #branching off from p4-integ
git merge -s ours main ## ignoring all changes from main
git checkout main
git merge p4mergebranch --squash
git commit -m "Type your integration message"
git branch -D p4mergebranch
  • Quando terminarmos a etapa acima, faça o merge das alterações para desenvolvimento:
 <p>Bitbucket has the following space stations:</p>
 <p>
     <b>Earth's Moon</b><br>
     Headquarters
 </p>

Como pode ter havido algumas alterações desde que escolhemos as alterações do desenvolvimento, pode haver a necessidade de fazer o merge delas primeiro. É importante, no entanto, atualizar a tag last-p4-integ para o commit correto, em especial não atualizar o commit de merge a ser desenvolvido. Para fazer isso de forma segura, é melhor marcar o estado atual do principal:

  • Remova a tag antiga no local e no remoto:
git tag -d tag/last-p4-integ
git push origin :refs/tags/tag/last-p4-integ
  • Crie uma tag na nova posição:
git checkout main
git tag -a tag/last-p4-integ -m "tag pointer to last develop commit integrated with p4"
  • Agora envie principal, desenvolvimento, p4-integ e tag/last-p4-integ para origem:

Conclusões


É assim que você sincroniza entre duas equipes de desenvolvimento ativas usando o Git e o Perforce. O processo acima evoluiu ao longo do tempo na TomTom e agora está sendo executado sem grandes problemas há algum tempo. Funciona, mas é uma boa quantidade de despesas gerais a serem mantidas. Se você tiver a opção, recomendamos migrar completamente para o Git.

De qualquer forma, se você seguir uma abordagem diferente para manter uma sincronização bidirecional, eu ficaria muito curioso para ouvir o que você tem a dizer nos comentários abaixo. Ou envie um tweet para @durdn ou @atlassiandev.

Mais uma vez obrigado a Andrea Carlevato, Adolfo Bulfoni e Krzysztof Karczewski.

Compartilhar este artigo

Leitura recomendada

Marque esses recursos para aprender sobre os tipos de equipes de DevOps ou para obter atualizações contínuas sobre DevOps na Atlassian.

Pessoas colaborando usando uma parede cheia de ferramentas

Blog do Bitbucket

Ilustração do DevOps

Caminho de aprendizagem de DevOps

Demonstrações de funções no Demo Den com parceiros da Atlassian

Como o Bitbucket Cloud funciona com o Atlassian Open DevOps

Inscreva-se para receber a newsletter de DevOps

Thank you for signing up