X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=dgit.git;a=blobdiff_plain;f=dgit-maint-debrebase.7.pod;h=e5abe1773c604e4913f985468288283f91e37901;hp=c615ce2eb75e49ac41252f72bdf64c30b10dd374;hb=0c244082ddb4b2443ccfbc1c438ead4fda1c33ca;hpb=ce81728bbbad2adfd4fbdd32467acec87eca5b3d diff --git a/dgit-maint-debrebase.7.pod b/dgit-maint-debrebase.7.pod index c615ce2e..e5abe177 100644 --- a/dgit-maint-debrebase.7.pod +++ b/dgit-maint-debrebase.7.pod @@ -209,47 +209,79 @@ patching the upstream source. This section explains how to convert an existing Debian package to this workflow. It should be skipped when debianising a new package. -=head2 No existing git history +If you have an existing git history that you have pushed to an +ordinary git server like B, we start with that. If +you don't already have it locally, you'll need to clone it, and obtain +the corresponding orig.tar from the archive: + +=over 4 + + % git clone salsa.debian.org:Debian/foo + % cd foo + % dgit setup-new-tree + % origtargz + +=back + +If you don't have any existing git history, or you have history only +on the special B server, we start with B: =over 4 % dgit clone foo % cd foo + +=back + +Then we make new upstream tags available: + +=over 4 + % git remote add -f upstream https://some.upstream/foo.git =back -=head2 Existing git history using another workflow +We now use a B command to convert your +existing history to the git-debrebase(5) data model. Which command +you should use depends on some facts about your repository: -First, if you don't already have the git history locally, clone it, -and obtain the corresponding orig.tar from the archive: +=over 4 + +=item (A) There is no delta queue. + +If there do not exist any Debian patches, use =over 4 - % git clone salsa.debian.org:Debian/foo - % cd foo - % origtargz + % git debrebase convert-from-gbp =back -If your tree is patches-unapplied, some conversion work is needed. -You can use +=item (B) There is a delta queue, and patches are unapplied. + +This is the standard git-buildpackage(1) workflow: there are Debian +patches, but the upstream source is committed to git without those +patches applied. Use =over 4 - git debrebase convert-from-gbp + % git debrebase convert-from-gbp =back -Then make new upstream tags available: +=item (C) There is a delta queue, and patches are applied. + +Use =over 4 - % git remote add -f upstream https://some.upstream/foo.git + % git debrebase convert-from-dgit-view =back -Now you simply need to ensure that your git HEAD is dgit-compatible, +=back + +Finally, you need to ensure that your git HEAD is dgit-compatible, i.e., it is exactly what you would get if you deleted .git, invoked B, and then unpacked the resultant source package. @@ -258,11 +290,9 @@ To achieve this, you might need to delete I. One way to have dgit check your progress is to run B. -The first dgit push will require I<--overwrite>. - =head1 GIT CONFIGURATION -git-debrebase does not yet support using B to merge +git-debrebase(1) does not yet support using B to merge divergent branches of development (see "OTHER MERGES" in git-debrebase(5)). You should configure git such that B does not try to merge: @@ -323,7 +353,7 @@ or if you have a working watch file =over 4 - % git debrebase new-upstream-v0 1.2.3 + % git debrebase new-upstream 1.2.3 =back @@ -406,7 +436,8 @@ is a single debrebase stitch. =head1 BUILDING AND UPLOADING You can use dpkg-buildpackage(1) for test builds. When you are ready -to build for an upload, use B. +to build for an upload, use B, B or B. Upload with B or B. Remember to pass I<--new> if the package is new in the target suite. @@ -429,9 +460,11 @@ you're using that. =head1 HANDLING DFSG-NON-FREE MATERIAL -This covers only DFSG-non-free material. Material which is legally -dangerous (for example, files which are actually illegal) cannot be -handled this way. +=head2 Illegal material + +Here we explain how to handle material that is merely DFSG-non-free. +Material which is legally dangerous (for example, files which are +actually illegal) cannot be handled this way. If you encounter possibly-legally-dangerous material in the upstream source code you should seek advice. It is often best not to make a @@ -439,22 +472,51 @@ fuss on a public mailing list (at least, not at first). Instead, email your archive administrators. For Debian that is To: dgit-owner@debian.org, ftpmaster@ftp-master.debian.org -=head2 When upstream tags releases in git +=head2 DFSG-non-free: When upstream tags releases in git -We create a DFSG-clean tag to import to master: +Our approach is to maintain a DFSG-clean upstream branch, and create +tags on this branch for each release that we want to import. We then +import those tags per "Importing the release", above. + +For the first upstream release that requires DFSG filtering: =over 4 - % git checkout -b pre-dfsg 1.2.3 + % 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 - % git branch -D pre-dfsg + % # proceed with "Importing the release" on 1.2.3+dfsg tag =back -=head2 When upstream releases only tarballs +And for subsequent releases (whether or not they require filtering): + +=over 4 + + % git checkout upstream-dfsg + % git merge 1.2.4 + % git rm further-evil.bin # if needed + % git commit -m "upstream version 1.2.4 DFSG-cleaned" # if needed + % git tag -s 1.2.4+dfsg + % git checkout master + % # proceed with "Importing the release" on 1.2.4+dfsg tag + +=back + +Our upstream-dfsg branch cannot be pushed to B, but since +we will need it whenever we import a new upstream version, we must +push it somewhere. Assuming that you have already set up an origin +remote per the above, + +=over 4 + + % git push --follow-tags -u origin master upstream-dfsg + +=back + +=head2 DFSG-non-free: When upstream releases only tarballs The easiest way to handle this is to add a B field to I, and a B setting in @@ -513,13 +575,13 @@ A simple convention you can use to minimise the number of pseudomerges is to B only right before you upload or push to B. -It is possible to reduce the number of pseudomerges further by -derebasing only (i) when importing a new release, and (ii) right -before uploading. Instead of editing the existing delta queue, you -append fixup commits (and reversions of commits) that alter the -upstream source to the required state. You can push and pull to and -from B during this. Just before uploading, you -debrebase, once, to tidy everything up. +It is possible, though much less convenient, to reduce the number of +pseudomerges yet further. We debrebase only (i) when importing a new +release, and (ii) right before uploading. Instead of editing the +existing delta queue, you append fixup commits (and reversions of +commits) that alter the upstream source to the required state. You +can push and pull to and from B during this. Just +before uploading, you debrebase, once, to tidy everything up. =head2 The debian/patches directory @@ -528,16 +590,30 @@ git-debrebase(1). You should not make changes there. They will either cause trouble, or be ignored and overwritten by git-debrebase(1). +I will often be out-of-date because git-debrebase(1) +will only regenerate it when it needs to. So you should not rely on +the information in that directory. When preparing patches to forward +upstream, you should use git-format-patch(1) on git commits, rather +than sending files from I. + =head2 Upstream branches -Except in the case where upstream releases only tarballs, we do not -maintain a separate 'upstream' branch (unless you also happen to be -involved in upstream development). We work with upstream tags rather -than any branches, except temporary branches used to prepare patches -for forwarding upstream, for example. +In this workflow, we specify upstream tags rather than any branches. + +Except when (i) upstream releases only tarballs, (ii) we require DFSG +filtering, or (iii) you also happen to be involved in upstream +development, we do not maintain any local branch corresponding to +upstream, except temporary branches used to prepare patches for +forwarding, and the like. -The thought behind this is that from Debian's point of view, upstream -releases are immutable points in history, better represented by tags. +The idea here is that from Debian's point of view, upstream releases +are immutable points in history. We want to make sure that we are +basing our Debian package on a properly identified upstream version, +rather than some arbitrary commit on some branch. Tags are more +useful for this. + +Upstream's branches remain available as the git remote tracking +branches for your upstream remote, e.g. I. =head2 The first ever dgit push @@ -547,6 +623,62 @@ avoids introducing a new origin commit into your git history. (This origin commit would represent the most recent non-dgit upload of the package, but this should already be represented in your git history.) +=head2 Inspecting the history + +The git history made by git-debrebase can seem complicated. +Here are some suggestions for helpful invocations of gitk and git. +They can be adapted for other tools like tig(1), git-log(1), magit, etc. + +History of package in Debian, disregarding history from upstream: + +=over + + % gitk --first-parent + +In a laundered branch, the delta queue is at the top. + +=back + +History of the packaging, excluding the delta queue: + + % gitk :/debian :!/debian/patches + +Just the delta queue (i.e. Debian's changes to upstream): + + % gitk --first-parent -- :/ :!/debian + +Full history including old versions of the delta queue: + +=over + + % gitk --date-order + +The "Declare fast forward" commits you see have an older history +(usually, an older delta queue) as one parent, +and a newer history as the other. +--date-order makes gitk show the delta queues in the right order. + +=back + +Complete diff since the last upload: + +=over + + % git diff dgit/dgit/sid..HEAD -- :/ :!/debian/patches + +This includes changes to upstream files. + +=back + +Interdiff of delta queue since last upload, if you really want it: + + % git debrebase make-patches + % git diff dgit/dgit/sid..HEAD -- debian/patches + +And of course there is: + + % git debrebase status + =head2 Alternative ways to start a debrebase Above we started an interactive debrebase by invoking git-debrebase(1) @@ -573,17 +705,23 @@ using git-rebase(1) directly. For example, =over 4 - % git debrebase launder + % git debrebase % git rebase -i HEAD~5 # there are 4 Debian patches =back If you take this approach, you should be very careful not to start the -rebase too early. +rebase too early, +including before the most recent pseudomerge. +git-rebase without a base argument will often +start the rebase too early, +and should be avoided. +Run git-debrebase instead. +See also "ILLEGAL OPERATIONS" in git-debrebase(5). =head1 SEE ALSO -dgit(1), dgit(7) +dgit(1), dgit(7), git-debrebase(1), git-debrebase(5) =head1 AUTHOR