Provided by: dgit_13.15_all 

NOME
dgit - tutorial para maintainers de pacote, usando um fluxo de trabalho centrado em redor do
git-debrebase(1)
INTRODUÇÃO
Este documento descreve elementos dum fluxo de trabalho para manter um pacote Debian não-nativo usando o
dgit. Nós mantemos o delta Debian como uma série de cometidos git no nosso ramo mestre. Nós usados
git-debrebase(1) para misturar o nosso ramo de tal modo que estas série de cometidos git aparecem no fim
do ramo. Todo o histórico git público é avançado-rápido, isto é, não não rescrevemos nem forçamos o
empurrar.
Algumas vantagens deste fluxo de trabalho:
• Manipular a fila delta usado o poder total do git-rebase(1), em vez de confiar em quilt(1), e sem ter
que mudar para a frente e para trás entre ramos de patches-aplicadas e patches-não-aplicadas ao
cometer alterações e ao tentar compilar, como com o gbp-pq(1).
• Se você está a usar 3.0 (quilt), forneça a sua fila delta como uma série de patches quilt separadas
por propriedades no pacote fonte que você enviou para o arquivo (ao contrário de com
dgit-maint-merge(7)).
• Evite que a árvore git fique suja pelo aplicar ou desaplicar de patches, pois elas são sempre
aplicadas.
• Benefit from dgit's safety catches. In particular, ensure that your upload always matches exactly
your git HEAD.
• Forneça um histórico git completo num formato standard em dgit-repos, onde pode beneficiar os
utilizadores do dgit de fluxos abaixo, tais como pessoas que usam o dgit para fazer um NMU (veja
dgit-nmu-simple(7) e dgit-user(7)).
• Minimiza a quantidade de conhecimento que você precisa de ter sobre 3.0 (quilt) de modo a manter
pacotes fonte Debian que usam esse formato.
Este fluxo de trabalho é apropriado para pacotes onde o delta Debian contém múltiplas peças que
interagem, ou os quais você não espera estar capaz de enviar ao autor em breve. Para pacotes com deltas
Debian simples e/ou de vida curta, o uso de git-debrebase(1) introduz complexidade desnecessária. Para
tais pacotes, considere o fluxo de trabalho descrito em dgit-maint-merge(7).
A DEBIANIZAÇÃO INICIAL
Esta secção explica como começar a usar este fluxo de trabalho com um novo pacote. Deve ser saltada
quando se converte um pacote existente para este fluxo de trabalho.
Quando etiquetas de autor são lançadas em git
Supondo que o lançamento de autor estável mais recente é 1.2.2, e isto foi etiquetado '1.2.2' pelo autor.
% git clone -oupstream https://some.upstream/foo.git
% cd foo
% git verify-tag 1.2.2
% git reset --hard 1.2.2
% git branch --unset-upstream
O comando final desanexa o seu ramo mestre do remoto do autor, assim esse git não tenta enviar nada para
lá, ou fundir cometidos do autor não lançados. Para manter uma cópia do seu ramo de empacotamento em
salsa.debian.org adicionalmente a dgit-repos, você pode fazer algo como isto:
% git remote add -f origin git@salsa.debian.org:debian/foo.git
% git push --follow-tags -u origin master
Agora siga e Debianise o seu pacote. Faça cometidos no ramo mestre, adicionando coisas no directório
debian/, ou aplicando patches na fonte do autor. Por razões técnicas, é essencial que o seu primeiro
cometer introduza o directório debian/ contendo pelo menos um ficheiro, e não faça mais nada. Por outras
palavras, faça um cometido a introduzir debian/ antes de aplicar patches à fonte do autor.
Finalmente, você precisa dum tarball original:
% git deborig
Veja git-deborig(1) se isto falhar.
Este tarball é efémero e facilmente regenerado, assim não o cometemos para lado nenhum (ex. com
ferramentas como o pristine-tar(1)).
Comparar lançamentos de tarball do autor
O que está em cima assume que você sabe como compilar o pacote a partir de git e que isso é feito
diretamente.
Se, como um utilizador da fonte do autor, você geralmente compilar a partir de lançamentos em tarball
do autor, em vez de etiquetas git do autor, você vai descobrir que por vezes a árvore git não contém
tudo o que está no tarball.
Podem ser necessários passos de compilação adicionais. Por exemplo, você poderá precisar do seu
debian/rules para correr ferramentas automáticas.
Você pode comparar o lançamento em tarball do autor, e a etiqueta git do autor, dentro do git, a
importar o tarball para o git como descrito na próxima secção, usando um valor diferente para
'upstream-tag', e depois usando git-diff(1) para comparar o tarball importado com a etiqueta de
lançamento.
Usando cometidos de autor não etiquetados
Por vezes o autor não etiqueta os seus lançamentos, ou você quer empacotar um instantâneo de git não
lançado. Em tais casos você pode criar a sua própria etiqueta de lançamento de autor, no formato
upstream/ver, onde ver é a versão de autor que você planeia colocar em debian/changelog. O prefixo
upstream/ assegura que a sua etiqueta não vai colidir com nenhumas etiquetas que o autor crie mais
tarde.
Por exemplo, suponha que o lançamento mais recente do autor é 1.2.2 e você quer empacotar o cometido
git ab34c21 que foi feito em 2013-12-11. Uma convenção comum é usar a versão de autor número
1.2.2+git20131211.ab34c21 e assim você podia usar
% git tag -s upstream/1.2.2+git20131211.ab34c21 ab34c21
para obter a etiqueta de lançamento, e depois proceder como em cima.
Pode-se gerar tal etiqueta versionada usando a opção --pretty do git show, ex.:
% git tag -s upstream/$(git show --date=format:%Y%m%d --pretty=format:"1.2.2+git%cd.%h" --quiet upstream/main) upstream/main
Quando o autor lança apenas tarballs
Porque nós queremos trabalhar em git, precisamos dum ramo de autor virtual com etiquetas de lançamento
virtuais. O gbp-import-orig(1) pode gerir isto para nós. Para começar
% mkdir foo
% cd foo
% git init
% git checkout -b upstream
% gbp import-orig \
--upstream-branch=upstream --debian-branch=master \
--upstream-tag='upstream/%(version)s' \
--sign-tags --no-pristine-tar \
../foo_1.2.2.orig.tar.xz
% git branch -f upstream
Isto deve deixa-lo no ramo mestre. De seguida, o nosso ramo de autor não pode ser empurrado para dgit-
repos, mas como precisamos dele sempre que importamos uma nova versão de autor, temos de o meter nalgum
lado. A escolha do costume é salsa.debian.org:
% git remote add -f origin salsa.debian.org:debian/foo.git
% git push --follow-tags -u origin master upstream
Você agora está pronto para prosseguir como em cima, fazendo cometidos para o directório debian/ e para a
fonte do autor. Como em cima, por razões técnicas, é essencial que o primeiro cometer introduza o
directório debian/ contendo pelo menos um ficheiro, e não faça mais nada. Por outras palavras, faça um
cometido a introduzir debian/ antes de aplicar patches à fonte do autor.
Uma maneira conveniente de assegurar que este requerimento está satisfeito é começar por criar
debian/gbp.conf:
[DEFAULT]
upstream-branch = upstream
debian-branch = master
upstream-tag = upstream/%(version)s
sign-tags = True
pristine-tar = False
pristine-tar-commit = False
[import-orig]
merge = False
e cometer isso:
% git add debian/gbp.conf && git commit -m "create gbp.conf"
Note que não conseguimos criar debian/gbp.conf antes de agora pelas mesmas razões técnicas que requerem
que o nosso primeiro cometer introduza debian/ sem aplicar patches à fonte do autor. É por isto que
tivemos de passar muitas opções à nossa primeira chamada ao gbp-import-orig(1).
CONVERTER UM PACOTE EXISTENTE
Esta secção explica como converter um pacote Debian existente para este fluxo de trabalho. Deve ser
saltada quando se está a debianizar um pacote novo.
Se você tem um histórico git existente que enviou para um servidor git normal como o salsa.debian.org,
nós começamos com isso. Se você já não o tiver localmente, vai precisar de o clonar, e obter o orig.tar
correspondente a partir do arquivo:
% git clone salsa.debian.org:debian/foo
% cd foo
% dgit setup-new-tree
% origtargz
Se você não tem um histórico git existente, ou tem o histórico apenas no servidor especial dgit-repos,
começamos com dgit clone:
% dgit clone foo
% cd foo
Então nós temos novas etiquetas de autor disponíveis:
% git remote add -f upstream https://some.upstream/foo.git
Agora nós usamos um comando git debrebase convert-from-* para converter o seu histórico existente para o
modelo de dados git-debrebase(5). Qual comando você deve usar depende de alguns factos sobre o seu
repositório:
(A) Não existe uma fila delta.
Se não existirem nenhumas patches Debian, use
% git debrebase convert-from-gbp
(B) Existe uma fila delta, e as patches não estão aplicadas.
Este é o fluxo de trabalho standard do git-buildpackage(1): existem patches Debian, mas a fonte do
autor é cometida ao git sem essas patches aplicadas. Use
% git debrebase convert-from-gbp
Se você não estava a usar dgit para enviar o seu pacote (isto é, você não estava a usar o fluxo de
trabalho descrito em dgit-maint-gbp(7)), e você correu dgit fetch sid neste clone do repositório, vai
precisar de passar --fdiverged a este comando.
(C) Existe uma fila delta, e as patches estão aplicadas.
Use
% git debrebase convert-from-dgit-view
Finalmente, você precisa assegurar que o seu CABEÇALHO git e compatível com dgit, isto é, é exatamente o
que obteria se apagasse .git, invocasse dpkg-buildpackage -S, e depois desempacotasse o pacote fonte
resultante.
Para conseguir isto, você pode precisar de apagar debian/source/local-options. Uma maneira de ter o dgit
a verificar o seu progresso é correr dgit build-source.
CONFIGURAÇÃO DO GIT
O git-debrebase(1) ainda não suporta usar git merge para fundir ramos divergentes de desenvolvimento
(veja "OUTRAS FUSÕES" em git-debrebase(5)). Você deve configurar o git de maneira que git pull não tente
a fusão:
% git config --local pull.rebase true
Agora quando você puxar trabalho de outros contribuidores de Debian, o git irá re-basear o seu trabalho
por cima do deles.
Se você usar este clone para desenvolvimento de autor em adição em trabalho de empacotamento Debian, pode
não querer definir esta definição global. Em vez disto, veja as definições branch.autoSetupRebase e
branch.<name>.rebase em git-config(5).
IMPORTAR NOVOS LANÇAMENTOS DO AUTOR
Existem dois passos: obter referências git que correspondem ao novo lançamento, e importar esse
lançamento usando git-debrebase(1).
Obtendo o lançamento
Quando etiquetas de autor são lançadas em git
% git fetch --tags upstream
Se você quer empacotar um cometido de autor não etiquetado (porque o autor não etiqueta os lançamentos ou
porque você quer empacotar um instantâneo de desenvolvimento do autor), veja "Usando cometidos de autor
não etiquetados" em cima.
Quando o autor lança apenas tarballs
Você vai precisar do debian/gbp.conf de "Quando o autor lança apenas tarballs", em cima. Você vai também
precisar do seu ramo de autor. Em cima, nós envia-mos isto para salsa.debian.org. Você vai precisar de
clonar ou ir buscar de lá, em vez de confiar apenas em dgit clone/dgit fetch.
Então, ou
% gbp import-orig ../foo_1.2.3.orig.tar.xz
ou se você tiver um ficheiro watch a funcionar
% gbp import-orig --uscan
Importar o lançamento
% git debrebase new-upstream 1.2.3
Esta invocação de git-debrebase(1) envolve um git re-base. Você pode precisar de resolver conflitos se a
fila delta Debian não se aplicar de modo limpo à nova fonte do autor.
Se tudo correu bem, você pode agora rever a fusão do novo lançamento do autor:
git diff debian/1.2.2-1..HEAD -- . ':!debian'
Também, faça diff com --name-status e --diff-filter=ADR para ver apenas a lista de ficheiros adicionados
ou removidos, o que é útil para determinar se existem ficheiros novos ou apagados que possam ter de ser
declarados no seu ficheiro copyright.
Se você obteve um tarball a partir do autor, está pronto para tentar uma compilação. Se você fundiu uma
etiqueta git a partir do autor, você vai precisar de primeiro gerar um tarball:
% git deborig
EDITAR O EMPACOTAMENTO DEBIAN
Apenas faça cometidos em mestre que mudem o conteúdo de debian/.
EDITAR A FILA DE ESPERA DELTA
Adicionar novas patches
Adicionar novas patches é direto: apenas faça cometidos que mexam em apenas ficheiros fora do directório
debian/. Você também pode usar ferramentas como git-revert(1), git-am(1) e git-cherry-pick(1).
Editar patches: iniciar um debrebase
git-debrebase(1) é um envoltório em redor do git-rebase(1) que permite-nos editar, re-ordenar e apagar
patches. Corra
% git debrebase -i
para iniciar um rebase interativo. Você pode editar, re-ordenar e apagar cometidos tal como fazia
durante git rebase -i.
Editar patches: acabar um debrebase
Após completar o git rebase, o seu ramo não vai estar em avanço rápido do CABEÇALHO git que tinha antes
do rebase. Isto significa que não podemos empurrar o ramo para lado nenhum. Se você está pronto para
enviar, o dgit push-source (ou dgit push-built) irá tratar de corrigir isto por si.
Se você ainda não está pronto para enviar, e quer empurrar o seu ramo para um git remoto tal como
salsa.debian.org,
% git debrebase conclude
Note que cada vez que você conclui um debrebase você introduz em entrada de pseudo-fusão no seu histórico
git, o que o pode tornar mais difícil de ler. Tente fazer todas as sua edições da fila delta que pensa
que vão ser necessárias para esta sessão de edição num único debrebase, para que haja um único ponto do
debrebase.
COMPILAR E ENVIAR
Você pode usar o dpkg-buildpackage(1) para compilações de teste. Quando estiver pronto para compilar
para um envio, use dgit sbuild, dgit pbuilder ou dgit cowbuilder.
Enviar com dgit push-source ou dgit push-built. Lembre-se de passar --new se o pacote for novo na suite
alvo.
Em alguns casos onde você usou git debrebase convert-from-gbp desde o último envio, não é possível ao
dgit avançar rápido o seu histórico a partir do histórico em dgit-repos. Em tais casos você vai ter que
passar --trust-changelog ao dgit. O git-debrebase irá normalmente dizer-lhe se isto vai ser preciso.
Se você quer enviar com o git-debpush(1), para o primeiro envio você deve passar a opção de modo quilt
--quilt=linear (veja git-debpush(1)).
Mesmo antes do envio, se você não o fez já, você pode querer que o git-debrebase(1) baralhe o seu ramo de
modo a que a fila delta Debian apareça mesmo na ponta do ramo que vai empurrar:
% git debrebase
% dgit push-source
Note que isto vai introduzir uma nova pseudo-fusão.
Após o empurrar do dgit, certifique de fazer git push para salsa.debian.org, se estiver a usar isso.
MANUSEAR MATERIAL DFSG-NÃO-LIVRE
Material ilegal
Aqui explicamos como lidar com material que é meramente DFSG-não-livre. Material que é legalmente
perigoso (por exemplo, ficheiros que são efectivamente ilegais) não pode ser lidado desta maneira.
Se você encontrar material possivelmente-legalmente-perigoso no código fonte do autor deve procurar
aconselhamento. É geralmente melhor não levantar ondas numa lista de mail pública (pelo menos, não de
início). Em vez disso, mande email aos administradores do arquivo. Para Debian isso é Para:
dgit-owner@debian.org, ftpmaster@ftp-master.debian.org
DFSG-não-livre: Quando o autor lança etiquetas em git
A nossa abordagem é manter um ramo de autor DFSG-limpo, e criar etiquetas neste ramo para cada lançamento
que queremos importar. Depois importamos essas etiquetas por "Importar o lançamento", em cima. No caso
de um pacote novo, nós baseamos a nossa Debianização inicial na nossa etiqueta DFSG-limpa.
Para o primeiro lançamento de autor que requer filtragem DFSG:
% git checkout -b upstream-dfsg 1.2.3
% git rm evil.bin
% git commit -m "upstream version 1.2.3 DFSG-cleaned"
% git tag -s 1.2.3+dfsg
% git checkout master
Agora ou prosseguimos com "Importar o lançamento" na etiqueta 1.2.3+dfsg, ou no caso de um pacote novo,
% git branch --unset-upstream
% git reset --hard 1.2.3+dfsg
e prosseguimos com "DEBIANIZAÇÃO INICIAL"
Para lançamentos subsequentes (precisem ou não de filtragem adicional):
% git checkout upstream-dfsg
% git merge 1.2.4
% git rm further-evil.bin # se necessário
% git commit -m "upstream version 1.2.4 DFSG-cleaned" # se necessário
% git tag -s 1.2.4+dfsg
% git checkout master
% # proceder com "Importar o lançamento" na etiqueta 1.2.4+dfsg
O nosso ramo autor-dfsg não pode ser enviado para dgit-repos, mas como vamos precisar dele sempre que
importamos uma nova versão de autor, temos de o empurrar para algum lado. Assumindo que você já
configurou um remoto de origem para o em cima,
% git push --follow-tags -u origin master upstream-dfsg
DFSG-não-livre: Quando o autor lança apenas tarballs:
A maneira mais fácil de lidar com isto é adicionar um campo Files-Excluded a debian/copyright, e uma
definição uversionmangle em debian/watch. Veja uscan(1). Em alternativa, veja a opção --filter
detalhada em gbp-import-orig(1).
INCORPORAR NMUS
No caso mais simples,
% dgit fetch
% git merge --ff-only dgit/dgit/sid
Se isso falhar, porque o seu ramo e o trabalho de quem faz NMU representam ramos divergentes de
desenvolvimento, você tem um número de opções. Aqui descrevemos as duas mais simples.
Note que você não deve tentar resolver os ramos divergentes ao editar ficheiros em debian/patches. As
alterações lá ou iriam causar problemas, ou sobrescritas pelo git-debrebase(1).
Re-basear o seu trabalho para o NMU
% git rebase dgit/dgit/sid
Se quem fez o NMU adicionou cometidos a modificar a fonte do autor, você vai provavelmente querer fazer
debrebase antes do próximo envio para arrumar as coisas.
Por exemplo, quem fez o NMU pode ter usado git-revert(1) para de-aplicar uma das suas patches. Pode ser
usado um debrebase para despir ambos a patch e a reversão da fila delta.
Aplicar manualmente o debdiff
Se não puder fazer rebase porque já empurrou para salsa.debian.org, digamos, você pode aplicar
manualmente o debdiff do NMU, cometer e fazer debrebase. O próximo dgit push vai requerer
--trust-changelog.
DICAS E SUGESTÕES
Minimizar as pseudo-fusões
Em cima nós notamos que cada vez que você concluía um debrebase, você introduzia uma pseudo-fusão no seu
histórico git, o que o pode tornar difícil de ler.
Uma convenção simples que pode usar para minimizar o número de pseudo-fusões é fazer git debrebase
conclude apenas logo antes de enviar ou empurrar para salsa.debian.org.
É possível, apesar de muito menos conveniente, reduzir ainda mais o número de pseudo-fusões. Fazemos
debrebase apenas (1) quando importamos um novo lançamento, e (2) logo antes do envio. Em vez de editar a
fila delta existente, você acrescenta cometidos de correção (e reversões de cometidos) que alteram a
fonte de autor para o estado requerido. Você pode empurrar para e puxar de salsa.debian.org durante
isto. Mesmo antes de enviar, você faz debrebase uma vez, para arrumar tudo.
O directório debian/patches
Neste fluxo de trabalho, debian/patches é puramente uma saída do git-debrebase(1). Você não deve fazer
alterações lá. Elas irão ou causar problemas, ou serem ignoradas e sobrescritas pelo git-debrebase(1).
debian/patches vai estar muitas vezes desatualizado porque o git-debrebase(1) irá apenas regenera-lo
quando precisa de o fazer. Assim você não se deve basear na informação nesse directório. Ao preparar
patches para encaminhar ao autor, você deve usar git-format-patch(1) em cometidos git, em vez de enviar
ficheiros de debian/patches.
Ramos do autor
Neste fluxo de trabalho, nós especificamos etiquetas de autor em vez de quaisquer ramos.
Excepto quando (1) o autor lança apenas tarballs, (2) nós requeremos filtragem DFSG, ou (3) você também
está envolvido com o desenvolvimento do autor, nós não mantemos nenhum ramo local correspondente ao
autor, excepto ramos temporários usados para preparar patches para encaminhar, e coisas parecidas.
A ideia aqui é que do ponto de vista de Debian, os lançamentos do autor são pontos imutáveis na história.
Nós queremos ter certeza que estamos a basear o nosso pacote Debian numa versão do autor identificada
apropriadamente, em vez de qualquer cometido arbitrário em algum ramo. As etiquetas são mais úteis para
isto.
Os ramos de autor continuam disponíveis como os ramos de acompanhamento do git remoto para o seu remoto
de autor, ex. remotes/upstream/master.
O primeiro dgit push de sempre
Se este é o primeiro dgit push do pacote para esta suite, considere passar
--deliberately-not-fast-forward em vez de --trust-changelog. Isto evita introduzir um novo cometer de
origem no seu histórico git. (Este cometer de origem iria representar o envio não-dgit mais recente do
pacote, mas isto já deve estar representado no seu histórico git.)
Inspecionar o histórico
O histórico git criado por git-debrebase pode parecer complicado. Aqui estão algumas sugestões para
invocações de ajuda de gitk e git. Elas podem ser adaptadas para outras ferramentas como tig(1),
git-log(1), magit, etc.
História do pacote em Debian, descartando a história do autor:
% gitk --first-parent
Num ramo lavado, a fila delta fica no topo.
História do empacotamento, excluindo a fila delta:
% gitk :/debian :!/debian/patches
Apenas a fila delta (isto é, as alterações Debian à fonte do autor):
% gitk --first-parent -- :/ :!/debian
Histórico completo incluindo versões antigas da fila delta:
% gitk --date-order
Os cometidos "Declara avanço rápido" que vê têm um histórico mais antigo (geralmente uma fila delta
mais antiga) que um pai, e uma história mais recente que o outro. --date-order faz o gitk mostrar as
filas delta na ordem certa.
Diff completo deste o último envio:
% git diff dgit/dgit/sid..HEAD -- :/ :!/debian/patches
Isto inclui alterações aos ficheiros do autor.
Interdiff da fila delta desde o último envio, se você realmente o quiser:
% git debrebase make-patches
% git diff dgit/dgit/sid..HEAD -- debian/patches
E claro existe isto:
% git debrebase status
Maneiras alternativas de arrancar um debrebase
Em cima nós arrancamos um debrebase interactivo ao invocar o git-debrebase(1) como isto:
% git debrebase -i
É também possível efetuar um re-base não interactivo, como isto:
% git debrebase -- [opções de git-rebase...]
Uma terceira alternativa é ter o git-debrebase(1) a baralhar todas as alterações Debian no fim do seu
ramo, e depois manipula-los você mesmo usando o git-rebase(1) diretamente. Por exemplo,
% git debrebase
% git rebase -i HEAD~5 # existem 4 patches Debian
Se você tomar esta abordagem, deve ter muito cuidado de não arrancar o rebase demasiado cedo, incluindo
antes da pseudo-fusão mais recente. O git-rebase sem um argumento base vai muitas vezes iniciar o rebase
mito cedo, e deve ser evitado. Corra git-debrebase em vez disso. Veja também "OPERAÇÕES ILEGAIS" em
git-debrebase(5).
VEJA TAMBÉM
dgit(1), dgit(7), git-debrebase(1), git-debrebase(5), gitrevisions(7)
AUTOR
Este tutorial foi escrito e é mantido por Sean Whitton <spwhitton@spwhitton.name>. Contém contributos de
outros contribuidores do dgit também - veja o ficheiro copyright do dgit.
Debian Project dgit+tag2upload team dgit-maint-debrebase(7)