From 4710ede86aa9ea299e58e8f7293ee7c493a53ce0 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Tue, 20 Jan 2009 15:43:44 -0800 Subject: [PATCH] Add GIT to master --- GIT | 197 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 GIT diff --git a/GIT b/GIT new file mode 100644 index 0000000000..68f4cb99c1 --- /dev/null +++ b/GIT @@ -0,0 +1,197 @@ +=========================== WHY USE GIT+TOPGIT? ========================== + +Three major concerns were on our mind when setting up this project. + + o First we needed to structure the project in such a way that it would be + easy to rebase all of our changes on the latest official ZFS release + from Sun. We absolutely need to be able to benefit from the upstream + improvements and not get locked in to an old version of the code base. + + o Secondly, we wanted to be able to easily manage our changes in terms + of a patch stack or graph. This allows us to easily isolate specific + changes and push them upstream for inclusion. It also allows us to + easily update or drop specific changes based on what occurs upstream. + + o Thirdly we needed our DVCS to be integrated with the management of this + patch stack or graph. We have tried other methods in the past such as + SVN+Quilt but have found managing the patch stack becomes cumbersome. + By using Git+TopGit to more tightly integrate our patches in to the repo + we expect several benefits. One of the most important will be the + ability to easily work on the patch's with a distributed development + team, additionally the repo can track patch history, and we can utilize + Git to merge patches and resolve conflicts. + +TopGit is designed to specifically address these concerns by providing +tools to simplify the handling of large numbers of interdependent topic +branches. When using a TopGit aware repo every topic branch represents +a 'patch' and that branch references its dependent branches. The union +of all these branches is your final source base. + +========================= SETTING UP GIT+TOPGIT ========================== + +First off you need to install a Git package on your system. For my +purposes I have been working on a RHEL5 system with git version 1.5.4.5 +installed and it has been working well. You will also need to go get +the latest version of TopGit which likely is not packaged nicely so you +will need to build it from source. You can use Git to clone TopGit +from the official site here and your all set: + + > git clone git://repo.or.cz/w/topgit.git + > make + > make install # Default installs to $(HOME) + +========================== TOPGIT AND ZFS ================================ + +One you have Git and TopGit installed you will want to clone a copy of +the Linux ZFS repo. While this project does not yet have a public home +it hopefully will some day. In the meanwhile if you have VPN access to +LLNL you can clone the latest official repo here. Cloning a TopGit +controlled repo is very similar to cloning a normal Git repo, but you +need to remember to use 'tg remote' to populate all topic branches. + + > git clone git://eris.llnl.gov/zfs.git + > cd zfs + > tg remote --populate origin + +Alternately, if you don't want to worry about using TopGit on your system +you can simply clone the repo and then checkout the origin/top branch. At +this point you can simply create a new branch to track your changes. You +can then feed your patch back to the official repo maintainers to be merged +in to the proper topic branches. + + > git clone git://eris.llnl.gov/zfs.git + > cd zfs + > git checkout origin/top + > git checkout -b + +Now that you have the Linux ZFS repo the first thing you will probably +want to do is have a look at all the topic branches. TopGit provides +a summary command which shows all the branches and a brief summary for +each branch obtained from the .topmsg files. + + > tg summary + 0 feature-branch [PATCH] feature-branch + feature-commit-cb [PATCH] feature commit cb + feature-zap-cursor-to-key [PATCH] feature zap cursor to key + ... + +By convention all TopGit branches are usually prefixed with 't/', however +I have chosen not to do this for simplicity. A different convention I have +adopted is to tag the top most TopGit branch as 'top' for easy reference. +This provides a consistent label to be used when you need to reference the +branch which contains the union of all topic branches. + +One thing you may also notice about the 'tg summary' command is it does +not show the branches in dependent order. This is done because TopGit allows +each branch to express multiple dependencies as a DAC. Initially this seemed +like an added complication which I planned to avoid by just implementing a +stack using the graph. However, this ended up being problematic because +with a stack when a change was made to a branch near the base, it was a +very expensive operation to merge the change up to the top of the stack. +By defining the dependencies as a graph it is possible to keep the depth +much shallower thus minimizing the merging. It has also proved insightful +as to each patches actual dependencies. + +To see the dependencies you will need to use the --graphviz option and pipe +the result to dot for display. The following command works fairly well for +me. Longer term it would be nice to update this option to use a preferred +config options stored in the repo. + + > tg summary --graphviz | dot -Txlib -Nfontsize=8 + +========================= UPDATING A TOPIC BRANCH ======================== + +Updating a topic branch in TopGit is a pretty straight forward but there +are a few rules you need to be aware of. The basic process involves +checking out the relevant topic branch where the changes need to be made, +making the changes, committing the changes to the branch and then merging +those changes in to dependent branches. TopGit provides some tools to make +this pretty easy, although it may be a little sluggish depending on how many +dependent branches are impacted by the change. Here is an example: + + > git checkout modify-topic-branch # Checkout the proper branch + > ...update branch... # Update the branch + > git commit -a # Commit your changes + > git checkout top # Checkout the top branch + > tg update # Recursively merge in new branch + +Assuming you change does not introduce any conflicts your done. All branches +were dependent on your change will have had the changed merged in. If your +change introduced a conflict you will need to resolve the conflict and then +continue on with the update. + +========================== ADDING A TOPIC BRANCH ========================= + +Adding a topic branch in TopGit can be pretty straight forward. If your +adding a non-conflicting patch in parallel with other patches of the same +type, then things are pretty easy and TopGit does all the work. + + > git co existing-topic-branch # Checkout the branch to add after + > tg create new-topic-branch # Create a new topic branch + > ...update .topmsg... # Update the branch message + > ...create patch... # Update with your changes + > git commit -a # Commit your changes + > git co dependent-topic-branch # Checkout dependent branch + > tg depend add new-topic-branch # Update dependencies + > git checkout top # Checkout the top branch + > tg update # Recursively merge in new branch + +If you need to add your patch in series with another change things are +a little more complicated. In this case TopGit does not yet support removing +dependencies so you will need to do it by hand, as follows. + + > git co existing-topic-branch # Checkout the branch to add after + > tg create new-topic-branch # Create a new topic branch + > ...update .topmsg... # Update the branch message + > ...create patch... # Update with your changes + > git commit -a # Commit your changes + > git co dependent-topic-branch # Checkout dependent branch + > ...update .topdeps... # Manually update dependencies + > git commit -a # Commit your changes + > tg update # TopGit update + > git checkout top # Checkout the top branch + > tg update # Recursively merge in new branch + +Once your done, I find it is a good idea view the repo using the +'tg summary --graphviz' command and verify the updated dependency graph. + +========================= REMOVING A TOPIC BRANCH ======================== + +Removing a topic branch in TopGit is also currently not very easy. To remove +a dependent branch the basic process is to commit a patch which reverts all +changes on the branch. Then that reversion must be merged in to all dependent +branches, the dependencies manually updated and finally the branch removed. +If the branch is not empty you will not be able to remove it. + + > git co delete-topic-branch # Checkout the branch to delete + > tg patch | patch -R -p1 # Revert all branch changes + > git commit -a # Commit your changes + > git checkout top # Checkout the top branch + > tg update # Recursively merge revert + > git co dependent-topic-branch # Checkout dependent branch + > ...update .topdeps... # Manually update dependencies + > git commit -a # Commit your changes + > tg delete delete-topic-branch # Delete empty topic branch + +Once your done, I find it is a good idea view the repo using the +'tg summary --graphviz' command and verify the updated dependency graph. + +============================ TOPGIT TODO ================================= + +TopGit is still a young package which seems to be under active development +by its author. It provides the minimum set of commands needed but there +are clearly areas which simply have not yet been implemented. My short +list of features includes: + + o 'tg summary --deps', option to display a text version of the topic + branch dependency DAC. + + o 'tg depend list', list all topic branch dependencies. + + o 'tg depend delete', cleanly remove a topic branch dependency. + + o 'tg create', cleanly insert a topic branch in the middle + of the graph and properly take care updating all dependencies. + + o 'tg delete', cleanly delete a topic branch in the middle + of the graph and properly take care updating all dependencies.