summaryrefslogtreecommitdiff
path: root/admin/notes/git-workflow
diff options
context:
space:
mode:
Diffstat (limited to 'admin/notes/git-workflow')
-rw-r--r--admin/notes/git-workflow135
1 files changed, 135 insertions, 0 deletions
diff --git a/admin/notes/git-workflow b/admin/notes/git-workflow
new file mode 100644
index 00000000000..d1d105a8a7a
--- /dev/null
+++ b/admin/notes/git-workflow
@@ -0,0 +1,135 @@
+(This is a draft. The method here won't actually work yet, because
+neither git-new-workdir nor merge-changelog are in the Emacs
+distribution yet.)
+
+Setting up and using git for normal, simple bugfixing
+=====================================================
+
+If you haven't configured git before you should first do:
+
+git config --global user.name "Frank Chu"
+git config --global user.email "fchu@example.com"
+
+Initial setup
+=============
+
+Then we want to clone the repository. We normally want to have both
+the current trunk and the emacs-24 branch.
+
+mkdir ~/emacs
+cd ~/emacs
+git clone <membername>@git.sv.gnu.org:/srv/git/emacs.git
+mv emacs trunk
+(cd trunk; git config push.default current)
+./trunk/admin/git-new-workdir trunk emacs-24
+cd emacs-24
+git checkout emacs-24
+git config push.default current
+
+You now have both branches conveniently accessible, and you can do
+"git pull" in them once in a while to keep updated.
+
+
+Fixing bugs
+===========
+
+You edit the files in either branch, `M-x vc-dir', and check in your
+changes. Then you need to push the data to the main repository. This
+will usually fail, since somebody else has pushed other changes in the
+meantime. To fix this, say
+
+git pull --rebase
+
+which will update your repository, and then re-apply your changes on
+top of that. Then say
+
+git push
+
+
+Backporting to emacs-24
+=======================
+
+If you have applied a fix to the trunk, but then decide that it should
+be applied to the emacs-24 branch, too, then
+
+cd ~/emacs/trunk
+git log
+
+and find the commit you're looking for. Then find the commit ID,
+which will look like
+
+commit 958b768a6534ae6e77a8547a56fc31b46b63710b
+
+cd ~/emacs/emacs-24
+git cherry-pick -xe 958b768a6534ae6e77a8547a56fc31b46b63710b
+
+and add "Backport:" to the commit string. Then
+
+git push
+
+
+Merging emacs-24 to trunk/master
+================================
+
+It is recommended to use the file gitmerge.el in the admin directory
+for merging 'emacs-24' into 'master'. It will take care of many
+things which would otherwise have to be done manually, like ignoring
+commits that should not land in master, fixing up ChangeLogs and
+automatically dealing with certain types of conflicts. If you really
+want to, you can do the merge manually, but then you're on your own.
+If you still choose to do that, make absolutely sure that you *always*
+use the 'merge' command to transport commits from 'emacs-24' to
+'master'. *Never* use 'cherry-pick'! If you don't know why, then you
+shouldn't manually do the merge in the first place; just use
+gitmerge.el instead.
+
+How to use gitmerge.el:
+
+Enter the Emacs repository, checkout 'master' and make sure it's
+up-to-date by doing a pull. Then start Emacs with
+
+ emacs -l admin/gitmerge.el -f gitmerge
+
+You'll be asked for the branch to merge, which will default to
+'origin/emacs-24', which you should accept. Merging a local tracking
+branch is discouraged, since it might not be up-to-date, or worse,
+contain commits from you which are not yet pushed upstream.
+
+You will now see the list of commits from 'emacs-24' which are not yet
+merged to 'master'. You might also see commits that are already
+marked for "skipping", which means that they will be merged with a
+different merge strategy ('ours'), which will effectively ignore the
+commit's diff while still being seen as merged, so it won't turn up
+again in future merges. Recognizing these kinds of commits is done
+with a simple regexp searching the log for strings like 'backport' or
+'merge', so you'll probably see false positives as well as false
+negatives. Carefully go through the commits, investigate them by
+hitting 'l', 'd' and 'f', and mark or unmark them for skipping with
+'s'. When you're done, hit 'm' to start the merge.
+
+You'll likely get conflicts during the process which cannot be dealt
+with automatically. In that case, the merge will stop and show you
+the list of conflicted files. Resolve those conflicts as usual using
+smerge and restart gitmerge (remember to enter the repository when
+doing that). You don't have to 'add' the resolved files and 'commit'
+the resulting merge, but if you really want to, feel free to do that.
+Note you can also resume gitmerge in a new Emacs session, since the
+current state will be saved to disk.
+
+When everything's done, look hard at the resulting merge. Skipping
+commits requires separate merges, so don't be surprised to see more
+than one merge commit. If you're happy, push.
+
+Warnings about X11 forwarding
+=============================
+
+If you get warnings like
+
+Warning: No xauth data; using fake authentication data for X11 forwarding.
+X11 forwarding request failed on channel 0
+
+when pulling or pushing data, add the following to the start of
+~/.ssh/config:
+
+Host git.sv.gnu.org
+ ForwardX11 no