mirror of
				https://git.proxmox.com/git/mirror_zfs.git
				synced 2025-10-26 18:05:04 +03:00 
			
		
		
		
	Add GIT to master
This commit is contained in:
		
							parent
							
								
									fb5f0bc833
								
							
						
					
					
						commit
						4710ede86a
					
				
							
								
								
									
										197
									
								
								GIT
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										197
									
								
								GIT
									
									
									
									
									
										Normal file
									
								
							@ -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 <new_branch_name>
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user