<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://docs.einsteintoolkit.org/et-docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Barry.wardell</id>
	<title>Einstein Toolkit Documentation - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://docs.einsteintoolkit.org/et-docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Barry.wardell"/>
	<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/Special:Contributions/Barry.wardell"/>
	<updated>2026-06-03T20:04:49Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=Thorns_we_know_of&amp;diff=3206</id>
		<title>Thorns we know of</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=Thorns_we_know_of&amp;diff=3206"/>
		<updated>2012-04-24T03:52:58Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are more public thorns around than just those in the Einstein Toolkit. This might be because the thorn does not satisfy our quality standards or because it is not yet clear if the thorn would be used by a number of users.&lt;br /&gt;
&lt;br /&gt;
If you have thorn that you would make public and maybe entually see included in the Einstein Toolkit, you are encouraged to list it here, together with a short description of what it does. Our hope is to provide a list of (most of) the available Cactus thorns. Having a thorn listed here also makes it easier for us to estimate how much interest there is in it.&lt;br /&gt;
&lt;br /&gt;
Source code repositories are vastly preferred over just source tarballs since they make it much easier for your users to contribute back changes.&lt;br /&gt;
If you are not yourself able to host a repository you might consider one of the public source code hosters such as those listed on [https://en.wikipedia.org/wiki/Comparison_of_open_source_software_hosting_facilities Wikipedia]. Some of [mailto:users@einsteintoolkit.org us] have used GitHub in the past as well as BitBucket (but see ticket [https://trac.einsteintoolkit.org/ticket/697 #697] for issues with it).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Thorn name&lt;br /&gt;
| Description&lt;br /&gt;
| Author(s)&lt;br /&gt;
| Licence&lt;br /&gt;
| Download instructions&lt;br /&gt;
|-&lt;br /&gt;
| Outflow&lt;br /&gt;
| Computes the flow of rest mass through a SphericalSurface, allows extra variables to be interpolated onto the surface&lt;br /&gt;
| Roland Haas, Tanja Bode&lt;br /&gt;
| GPL v2+&lt;br /&gt;
| svn co https://svn.einsteintoolkit.org/incoming/Outflow&lt;br /&gt;
|-&lt;br /&gt;
| SphericalSlice&lt;br /&gt;
| Provides infrastructure to interpolate grid functions onto sphere, to compute intergrals as well as IO facilities.&lt;br /&gt;
| Christian Reisswig&lt;br /&gt;
| unknown&lt;br /&gt;
| svn co https://svn.einsteintoolkit.org/incoming/SphericalSlice&lt;br /&gt;
|-&lt;br /&gt;
| ADMDerivatives&lt;br /&gt;
| Computes time and space derivatives of the ADMBase variables&lt;br /&gt;
| Christian Reisswig&lt;br /&gt;
| GNU&lt;br /&gt;
| svn co https://svn.einsteintoolkit.org/incoming/ADMDerivatives&lt;br /&gt;
|-&lt;br /&gt;
| SphericalHarmonicReconASCII&lt;br /&gt;
| Computes boundary data for CCE using SphericalSlice and ADMDerivatives&lt;br /&gt;
| Christian Reisswig&lt;br /&gt;
| unknown&lt;br /&gt;
| svn co https://svn.einsteintoolkit.org/incoming/PITTNullCode/SphericalHarmonicReconASCII/&lt;br /&gt;
|-&lt;br /&gt;
| EinsteinExact&lt;br /&gt;
| Computes exact initial data for the ADMBase variables&lt;br /&gt;
| Barry Wardell and Ian Hinder&lt;br /&gt;
| GPL&lt;br /&gt;
| git clone --recursive git://github.com/barrywardell/EinsteinExact&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2431</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2431"/>
		<updated>2011-07-12T10:26:56Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Setting up Gitolite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Setting up Gitolite ==&lt;br /&gt;
Follow the Gitolite [http://sitaramc.github.com/gitolite/doc/1-INSTALL.html#_root_method installation instructions]:&lt;br /&gt;
&lt;br /&gt;
On the server (as root):&lt;br /&gt;
  useradd -d /var/git -s /bin/bash -m git&lt;br /&gt;
  git clone git://github.com/sitaramc/gitolite&lt;br /&gt;
  cd gitolite&lt;br /&gt;
  src/gl-system-install&lt;br /&gt;
  su - git&lt;br /&gt;
  gl-setup /tmp/admin.pub&lt;br /&gt;
&lt;br /&gt;
On your workstation:&lt;br /&gt;
  git clone git@server:gitolite-admin&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a super repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2430</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2430"/>
		<updated>2011-07-12T10:23:45Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Setting up Gitolite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Setting up Gitolite ==&lt;br /&gt;
Follow the Gitolite [http://sitaramc.github.com/gitolite/doc/1-INSTALL.html#_root_method installation instructions]:&lt;br /&gt;
&lt;br /&gt;
On the server (as root):&lt;br /&gt;
  useradd -d /var/git -s /bin/bash -m git&lt;br /&gt;
  apt-get install git-core&lt;br /&gt;
  git clone git://github.com/sitaramc/gitolite&lt;br /&gt;
  cd gitolite&lt;br /&gt;
  src/gl-system-install&lt;br /&gt;
  su - git&lt;br /&gt;
  gl-setup /tmp/admin.pub&lt;br /&gt;
&lt;br /&gt;
On your workstation:&lt;br /&gt;
  git clone git@server:gitolite-admin&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a super repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2429</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2429"/>
		<updated>2011-07-12T10:22:26Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Setting up Gitolite */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Setting up Gitolite ==&lt;br /&gt;
Follow the Gitolite [http://sitaramc.github.com/gitolite/doc/1-INSTALL.html#_root_method installation instructions]:&lt;br /&gt;
  useradd -d /var/git -s /bin/bash -m git&lt;br /&gt;
  apt-get install git-core&lt;br /&gt;
  git clone git://github.com/sitaramc/gitolite&lt;br /&gt;
  cd gitolite&lt;br /&gt;
  src/gl-system-install&lt;br /&gt;
  gl-setup /tmp/admin.pub&lt;br /&gt;
  git clone git@server:gitolite-admin&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a super repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2428</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2428"/>
		<updated>2011-07-12T10:22:02Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Hosting mirrors on a server */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Setting up Gitolite ==&lt;br /&gt;
Follow the Gitolite [http://sitaramc.github.com/gitolite/doc/1-INSTALL.html#_root_method installation instructions]:&lt;br /&gt;
useradd -d /var/git -s /bin/bash -m git&lt;br /&gt;
apt-get install git-core&lt;br /&gt;
git clone git://github.com/sitaramc/gitolite&lt;br /&gt;
cd gitolite&lt;br /&gt;
src/gl-system-install&lt;br /&gt;
gl-setup /tmp/admin.pub&lt;br /&gt;
git clone git@server:gitolite-admin&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a super repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2420</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2420"/>
		<updated>2011-06-27T16:08:22Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Creating a repository */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a super repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2419</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2419"/>
		<updated>2011-06-27T16:05:26Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
= Hosting mirrors on a server =&lt;br /&gt;
&lt;br /&gt;
Rather than everyone creating their own local mirrors which they have to worry about keeping up-to-date, it makes sense to have a central server do so. In this section, we describe how to setup a server using [https://github.com/sitaramc/gitolite Gitolite].&lt;br /&gt;
&lt;br /&gt;
== Permissions ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2418</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2418"/>
		<updated>2011-06-27T15:58:50Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Local mirrors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. While GetComponents makes it get everything from their original locations, it may be still desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2417</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2417"/>
		<updated>2011-06-27T15:57:11Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Removing a submodule */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. It may be desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
To remove a submodule from the super repository, use:&lt;br /&gt;
&lt;br /&gt;
  git module rm &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
check the changes look OK, then commit and push.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2416</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2416"/>
		<updated>2011-06-27T15:55:42Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Local mirrors */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. It may be desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may want to develop a new feature privately within your group before publicly releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development branch which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepo&amp;diff=2415</id>
		<title>GitSuperRepo</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepo&amp;diff=2415"/>
		<updated>2011-06-27T15:51:23Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Documents */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
The current method for checking out and updating components of the Einstein Toolkit has several shortcomings.  We propose an additional layer of management around a Cactus tree achieved by storing it in a Git repository.  This provides a uniform version control interface to the code with all the version control information from the source repositories available.  It also allows the entire Cactus tree to be treated as a single repository, and allows &amp;quot;versions&amp;quot; of the code to be identified by a single Git revision.&lt;br /&gt;
&lt;br /&gt;
This project is still in the early stages.  We (Barry Wardell and Ian Hinder) are developing a set of techniques and tools which enable what we consider to be better workflows for using Cactus.  As we use these ourselves, we will learn about what works and what doesn&amp;#039;t, and hopefully will be able to provide recommended workflows for end-users.&lt;br /&gt;
&lt;br /&gt;
==Documents==&lt;br /&gt;
&lt;br /&gt;
* [[GitSuperRepoRationale|Rationale]]&lt;br /&gt;
* [[GitSuperRepoUsersGuide|User&amp;#039;s guide]]&lt;br /&gt;
* [[GitSuperRepoAdminGuide|Server administrator&amp;#039;s guide]]&lt;br /&gt;
* [[GitSuperRepoUnsorted|Unsorted information]]&lt;br /&gt;
&lt;br /&gt;
==Progress==&lt;br /&gt;
&lt;br /&gt;
* We have set up a repository which implements most of what is described in the [[GitSuperRepoRationale|Rationale]].&lt;br /&gt;
&lt;br /&gt;
* Repository is updated from the source repositories every hour&lt;br /&gt;
&lt;br /&gt;
==Planned work==&lt;br /&gt;
&lt;br /&gt;
* Figure out some good scripts or git aliases for making working with the submodules more straightforward.&lt;br /&gt;
&lt;br /&gt;
* Set up a public &amp;quot;einsteintoolkit&amp;quot; repository&lt;br /&gt;
&lt;br /&gt;
* Integrate with build-and-test system so that there is always a branch which passes build-and-test&lt;br /&gt;
&lt;br /&gt;
* Implement a technique for storing version control information (revision plus differences) into simulation output&lt;br /&gt;
&lt;br /&gt;
* Update the group repository based on commit emails or an RSS feed rather than hourly&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2413</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2413"/>
		<updated>2011-06-27T15:51:07Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: GitSuperRepoServerGuide moved to GitSuperRepoAdminGuide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. It may be desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may often want to develop a new feature privately within your group before releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoServerGuide&amp;diff=2414</id>
		<title>GitSuperRepoServerGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoServerGuide&amp;diff=2414"/>
		<updated>2011-06-27T15:51:07Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: GitSuperRepoServerGuide moved to GitSuperRepoAdminGuide&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[GitSuperRepoAdminGuide]]&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2412</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2412"/>
		<updated>2011-06-27T15:50:05Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Server Guide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Local mirrors =&lt;br /&gt;
The modules in a Cactus tree typically constitute a large number of repositories in various version control systems from wide number of sources. It may be desirable to create local mirrors of these modules for several reasons:&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Speed&amp;#039;&amp;#039;&amp;#039; - Some sources may be on the other side of the world so having a nearby local mirror can dramatically reduce the time to access them.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Privacy&amp;#039;&amp;#039;&amp;#039; - You may often want to develop a new feature privately within your group before releasing it. If this feature is based on an existing module then having a local mirror means you can create local private development which can later be easily merged and pushed upstream.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Convenience&amp;#039;&amp;#039;&amp;#039; - With remote repositories in a variety of version control systems, it is easy to get confused. Having local mirrors of these in a single version control system (i.e. git) simplifies things so that only a single tool is needed. In the case where the remote repository is in SVN local git mirrors also provides the advantage of offering the additional features git provides over svn.&lt;br /&gt;
&lt;br /&gt;
This section describes how to setup, host and administer local mirrors of remote repositories.&lt;br /&gt;
&lt;br /&gt;
== Creating repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Adding repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Removing repository mirrors ==&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
= Super repository =&lt;br /&gt;
With repository mirrors created and all modules now available as git repositories, it is quite convenient to have a container repository to manage everything. This container can be implemented as a git super-repository with git submodules for each component. In this section, we describe how to setup and administer such a repository, both locally and using a central server.&lt;br /&gt;
&lt;br /&gt;
== Creating a repository ==&lt;br /&gt;
&lt;br /&gt;
== Common tasks ==&lt;br /&gt;
&lt;br /&gt;
=== Adding a submodule ===&lt;br /&gt;
Adding a new submodule is as simple as running:&lt;br /&gt;
&lt;br /&gt;
  git module add &amp;lt;url-to-repository&amp;gt; &amp;lt;path-to-submodule&amp;gt; [&amp;lt;upstream-url&amp;gt;] [&amp;lt;upstream-type&amp;gt;] [&amp;lt;track-branch&amp;gt;]&lt;br /&gt;
&lt;br /&gt;
checking the changes look OK, committing and then pushing. The optional arguments &amp;lt;upstream-url&amp;gt;, &amp;lt;upstream-type&amp;gt; and &amp;lt;upstream-branch&amp;gt; specify the URL and type of the upstream version of this repository and the branch which the super-repository should track. If not given, &amp;lt;upstream-url&amp;gt; is assumed to be the same as &amp;lt;url-to-repository&amp;gt; and &amp;lt;upstream-type&amp;gt; is assumed to be &amp;#039;git&amp;#039;. Other possible options for &amp;lt;upstream-type&amp;gt; are &amp;#039;hg&amp;#039; and &amp;#039;svn&amp;#039;. If &amp;lt;track-branch&amp;gt; is not given it defaults to &amp;#039;trunk&amp;#039; for git-svn repositories and &amp;#039;master&amp;#039; for git and hg-git repositories.&lt;br /&gt;
&lt;br /&gt;
=== Removing a submodule ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2411</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2411"/>
		<updated>2011-06-27T14:30:59Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Optional Extras */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Server Guide =&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2410</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2410"/>
		<updated>2011-06-27T14:30:12Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Optional Extras ==&lt;br /&gt;
=== Blocking pushes of unnecessary merge commits ===&lt;br /&gt;
&lt;br /&gt;
While working on a change in a git repository, it often happens that while you make local commits someone else pushes their own changes to the central repository. If you then try to push your changes, your push will be rejected as a non-fast-forward commit. The easiest solution is to pull the new changes from the server before pushing. However, this will introduce a &amp;#039;merge commit&amp;#039; in the process. These merge commits rapidly build up and clutter up the history of the repository. For this reason, instead of pulling and introducing a merge commit you should do one of two things:&lt;br /&gt;
* Rebase your changes on top of the central repository. This can be achieved using &amp;#039;git pull --rebase&amp;#039;.&lt;br /&gt;
* If your changes are significant, you can create a new named branch for them and merge that branch into the branch from the central repository.&lt;br /&gt;
In an ideal world, everyone would always follow these rules. However, in practice it is easy to forget to do so.&lt;br /&gt;
&lt;br /&gt;
A solution is to block these merge commits from ever being pushed to the server. This is easily achieved using a git hook on the server side. The file &amp;#039;update.merge&amp;#039; in the git-module repository gives an example of how to so. Place this file in the hooks directory of the repository on your server, rename it to &amp;#039;update&amp;#039; and make sure it is executable. It will then block these annoying merge commits while allowing through genuine merge commits from named branches.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2409</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2409"/>
		<updated>2011-06-27T14:12:22Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, you can treat the submodule as a regular git repository and commit as normal. The method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
In addition to the super repository being a git repository, each sub-repository is also a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot;, etc.  This works for repositories which are SVN or Mercurial upstream, because we use git-svn and hg-git to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2408</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2408"/>
		<updated>2011-06-27T14:10:04Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
In addition to the super repository being a git repository, each sub-repository is also a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot;, etc.  This works for repositories which are SVN or Mercurial upstream, because we use git-svn and hg-git to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2407</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2407"/>
		<updated>2011-06-27T14:09:40Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
In addition to the super repository being a git repository, each sub-repository is also a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot;, etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2406</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2406"/>
		<updated>2011-06-27T14:09:27Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
In addition to the super repository being a git repository, each sub-repository is also a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2405</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2405"/>
		<updated>2011-06-27T14:09:11Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
In addition to the super repository being a git repository, each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2404</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2404"/>
		<updated>2011-06-27T14:08:36Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/ GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2403</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2403"/>
		<updated>2011-06-27T14:07:29Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [GitX|http://gitx.laullon.com/] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2402</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2402"/>
		<updated>2011-06-27T14:06:44Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing history */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend [http://gitx.laullon.com/|GitX] for Mac OS, and git-gui/gitk for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2401</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2401"/>
		<updated>2011-06-27T14:03:53Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Updating */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
Before updating, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory and get any available updates:&lt;br /&gt;
&lt;br /&gt;
  git fetch &amp;amp;&amp;amp; git submodule foreach git fetch&lt;br /&gt;
&lt;br /&gt;
You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git log --reverse --oneline -p --submodule master..origin/master $(git submodule|awk &amp;#039;{print $2}&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
If this looks OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2400</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2400"/>
		<updated>2011-06-27T13:58:03Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Mercurial */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2399</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2399"/>
		<updated>2011-06-27T13:57:23Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out a specific branch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout --all&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2398</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2398"/>
		<updated>2011-06-27T13:57:05Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out a specific branch */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06 &amp;amp;&amp;amp; git module checkout&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2397</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2397"/>
		<updated>2011-06-27T13:55:11Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2396</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2396"/>
		<updated>2011-06-27T13:53:48Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* SVN */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
For submodules which use SVN upstream, you can commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2395</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2395"/>
		<updated>2011-06-27T13:53:01Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control system used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2394</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2394"/>
		<updated>2011-06-27T13:52:47Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash. Once you have completed this process for a submodule, the method of pushing depends on the version control used upstream.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2393</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2393"/>
		<updated>2011-06-27T13:52:08Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2392</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2392"/>
		<updated>2011-06-27T13:51:31Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Git */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, once you have enabled upstream pushing you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2391</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2391"/>
		<updated>2011-06-27T13:49:51Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2390</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2390"/>
		<updated>2011-06-27T13:49:16Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream simfactory&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2389</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2389"/>
		<updated>2011-06-27T13:49:00Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Committing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.  Also, don&amp;#039;t we need to do some fetching first?&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
For sub-repositories which are upstream (as most are), regardless of which revision control system is used upstream you must first initialise the sub-repository for committing:&lt;br /&gt;
&lt;br /&gt;
git module init-upstream &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
e.g.&lt;br /&gt;
&lt;br /&gt;
  git module init-upstream simfactory&lt;br /&gt;
&lt;br /&gt;
from the root Cactus (super-repo) directory. You can get a list of the available submodules with &amp;quot;git module ls&amp;quot; or by using tab completion if your shell is bash.&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories. &lt;br /&gt;
&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
You can now commit directly to the source SVN repository using, from the submodule directory,&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.  This will push any local commits to SVN.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn). In this case, you make commits locally to your submodule as if it were a regular git repository. Then, when you want to push upstream:&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;.hg&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2384</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2384"/>
		<updated>2011-06-27T08:40:26Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup &amp;amp;&amp;amp; source ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2383</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2383"/>
		<updated>2011-06-27T08:40:06Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup&lt;br /&gt;
  . ~/.profile&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2382</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2382"/>
		<updated>2011-06-27T08:39:46Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  ./bin/git-module setup&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2381</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2381"/>
		<updated>2011-06-27T08:39:29Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Checking out */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history. When it is done, setup the git-module package which provides convenience functionality:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  bin/git-module setup&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUnsorted&amp;diff=2380</id>
		<title>GitSuperRepoUnsorted</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUnsorted&amp;diff=2380"/>
		<updated>2011-06-27T08:36:00Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;This is a list of things that would be useful to include in the documentation somewhere&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
* A possible way to link the problems and solutions would be with two or three common scenarios. These would highlight a limitation/annoyance and show how our system provides an easy solution.&lt;br /&gt;
&lt;br /&gt;
* A nice summary: The idea is to have a central &amp;quot;group&amp;quot; repository which points to a series of git and git-svn repositories as submodules, checked out using GetComponents.  The group repository is what is cloned by users in the group, and will contain both public and private code.  Gitolite can handle permissions based on users and branches.  The group repository (and its submodules) would be updated from the upstream versions on any commits, and users could pull from the group repository when they wanted to.&lt;br /&gt;
&lt;br /&gt;
* We could also have branches in the repository for the ET releases, and switching between them should be a lot easier than it is now (which is usually a case of &amp;quot;nuke your tree and check out again&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
* We should also provide a public example of such a repository, containing e.g. the Einstein Toolkit. This could then be used in our ET demonstration.&lt;br /&gt;
&lt;br /&gt;
==Current setup==&lt;br /&gt;
&lt;br /&gt;
* A git repository which only contains submodules and a few symlinks.&lt;br /&gt;
* Git submodules for each remote repository.&lt;br /&gt;
* In the case where the remote repository is an svn server, there is a git-svn clone hosted by us. Users can create and push new branches to this clone (provided they&amp;#039;re named numrel/*), but cannot update the branches which come from svn.&lt;br /&gt;
* Similarly for remote Mercurial repositories I have a git clone which we host.&lt;br /&gt;
* For remote git repositories where we may want &amp;#039;internal&amp;#039; branches, we host a mirror of the remote repository and allow additional branches to be created. These additional branches are only on our mirror, they are not pushed back upstream. As an example of this, we have a mirror of McLachlan which has a branch with vectorisation enabled.&lt;br /&gt;
* All mirrors (git-svn, git-hg and git) are automatically kept up to date with an hourly cron job, as is the &amp;#039;submodules&amp;#039; branch of the super-repository.&lt;br /&gt;
* Commiting back upstream works for git, svn and hg.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2379</id>
		<title>GitSuperRepoAdminGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoAdminGuide&amp;diff=2379"/>
		<updated>2011-06-27T08:35:49Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here a guide to setting up a Git server with a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Have temporarily copy+pasted the README which is in note form - need to write a proper up-to-date guide.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
###############################################################################&lt;br /&gt;
# CactusGit&lt;br /&gt;
###############################################################################&lt;br /&gt;
&lt;br /&gt;
# Introduction&lt;br /&gt;
&lt;br /&gt;
# This package allows you to check out Cactus using GetComponents from&lt;br /&gt;
# a CRL thornlist using git-svn instead of svn for the svn&lt;br /&gt;
# repositories.  This means that your local Cactus tree contains&lt;br /&gt;
# complete version information and history and can be managed using&lt;br /&gt;
# git rather than svn.&lt;br /&gt;
&lt;br /&gt;
# Further, the package provides tools for creating a&lt;br /&gt;
# &amp;quot;super-repository&amp;quot; for the tree with pointers to the downloaded&lt;br /&gt;
# repositories as git submodules.  This means that the state of the&lt;br /&gt;
# tree can be identified by a single commit ID and can be cloned&lt;br /&gt;
# directly without having to use GetComponents or git-svn.&lt;br /&gt;
&lt;br /&gt;
# Notes&lt;br /&gt;
# * To make this more convenient, small wrapper scripts can be written&lt;br /&gt;
#   to replace the recipes given below&lt;br /&gt;
#&lt;br /&gt;
# * GetComponents could be extended to support git-svn directly,&lt;br /&gt;
#   rather than using the wrapper-script approach that is currently&lt;br /&gt;
#   used&lt;br /&gt;
&lt;br /&gt;
# Tutorial&lt;br /&gt;
&lt;br /&gt;
# Add our tools to the path, including the svn wrapper which tricks&lt;br /&gt;
# GetComponents into making a git-svn clone of each svn repository.&lt;br /&gt;
# We also include a copy of GetComponents here for convenience.&lt;br /&gt;
export OLDPATH=$PATH PATH=$PWD/bin:$PATH&lt;br /&gt;
&lt;br /&gt;
# Check out the tree into the Cactus directory (can take a very long&lt;br /&gt;
# time, ~60 minutes, and does not show progress for each repository&lt;br /&gt;
# until it has checked it out completely)&lt;br /&gt;
GetComponents -v -a WaveToy.th&lt;br /&gt;
&lt;br /&gt;
# Now manually checkout any thorns which require authentication&lt;br /&gt;
git svn clone ...&lt;br /&gt;
&lt;br /&gt;
# Add the git-svn repos to your server (also add the Cactus super-repo).&lt;br /&gt;
crlrepos WaveToy.th &amp;gt; gitsvn.list&lt;br /&gt;
cd &amp;lt;gitolite_dir&amp;gt;&lt;br /&gt;
vi conf/gitolite.conf # Add the repositories in gitsvn.list&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Add a &amp;#039;fetching and pushing&amp;#039; (fp) user&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Push as the fp user&lt;br /&gt;
scp Cactus fp@server:fetch/&lt;br /&gt;
scp gitsvn.list fp@server:fetch/&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i &amp;amp;&amp;amp; git remote add bare cactus@localhost:$i &amp;amp;&amp;amp; git config --unset remote.bare.fetch &amp;amp;&amp;amp; git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039; &amp;amp;&amp;amp; git push bare &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# On the server, update the HEAD of the git-svn repos&lt;br /&gt;
ssh cactus@server&lt;br /&gt;
cd ~/repositories&lt;br /&gt;
for i in `cat ../fetch/gitsvn`; do cd $i.git &amp;amp;&amp;amp; git symbolic-ref HEAD refs/heads/git-svn &amp;amp;&amp;amp; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Generate a super-repository called CactusGit using all the&lt;br /&gt;
# repositories from Cactus listed in WaveToy.th&lt;br /&gt;
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th&lt;br /&gt;
&lt;br /&gt;
# Add non-svn repos&lt;br /&gt;
GetComponents Llama.CTGamma.ET.th&lt;br /&gt;
rm -rf repos&lt;br /&gt;
git submodule add ... repos/...&lt;br /&gt;
&lt;br /&gt;
# Symlink flesh&lt;br /&gt;
ln -s flesh/CONTRIBUTORS&lt;br /&gt;
ln -s flesh/COPYRIGHT&lt;br /&gt;
ln -s flesh/Makefile&lt;br /&gt;
ln -s flesh/doc&lt;br /&gt;
ln -s flesh/lib&lt;br /&gt;
&lt;br /&gt;
# Commit symlinks (as fp)&lt;br /&gt;
git add *&lt;br /&gt;
git commit ...&lt;br /&gt;
git push cactus@localhost:Cactus master:master&lt;br /&gt;
&lt;br /&gt;
######### Administrators ########&lt;br /&gt;
# Updating the git-svn mirrors&lt;br /&gt;
for i in `cat gitsvn.list`; do cd $i; git svn fetch &amp;amp;&amp;amp; git push bare; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the hg-git mirrors&lt;br /&gt;
for i in `cat githg.list`; do cd $i; hg pull &amp;amp;&amp;amp; hg push git; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating the git mirrors&lt;br /&gt;
for i in `cat git.list`; do cd $i; git fetch -a -u &amp;amp;&amp;amp; git push bare --all; cd -; done&lt;br /&gt;
&lt;br /&gt;
# Updating all submodules in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
git pull&lt;br /&gt;
git submodule foreach git pull&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
&lt;br /&gt;
# Updating a single submodule in the super-repo&lt;br /&gt;
cd Cactus&lt;br /&gt;
cd &amp;lt;repo-path&amp;gt;&lt;br /&gt;
git pull&lt;br /&gt;
cd -&lt;br /&gt;
git commit -m &amp;quot;Update submodule &amp;lt;repo-path&amp;gt;.&amp;quot; &amp;lt;repo-path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
# Automatic updates of super-repo&lt;br /&gt;
git clone --recursive cactus@localhost:Cactus&lt;br /&gt;
cd Cactus&lt;br /&gt;
git submodule foreach &amp;#039;git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK&amp;#039;&lt;br /&gt;
git remote set-url origin /var/cactus/repositories/Cactus&lt;br /&gt;
git remote set-url --push origin cactus@git.barrywardell.net:Cactus&lt;br /&gt;
git checkout submodules&lt;br /&gt;
git pull origin submodules&lt;br /&gt;
git submodule foreach &amp;#039;git fetch origin &amp;amp;&amp;amp; git checkout origin&amp;#039;&lt;br /&gt;
git commit -m &amp;quot;Update submodules.&amp;quot; -a&lt;br /&gt;
git push origin submodules&lt;br /&gt;
&lt;br /&gt;
# Adding a git-svn repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi gitsvn.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git svn clone -s &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git config remote.bare.push &amp;#039;refs/remotes/*:refs/heads/*&amp;#039;&lt;br /&gt;
git push bare&lt;br /&gt;
cd ~/repositories/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git symbolic-ref HEAD refs/heads/trunk&lt;br /&gt;
cd ~/fetch/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git pull bare&lt;br /&gt;
&lt;br /&gt;
# Adding a hg-git repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi githg.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
hg clone &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
vi .hg/hgrc # Add: &lt;br /&gt;
            # [path]&lt;br /&gt;
            # git = git+ssh://localhost/&amp;lt;newrepo&amp;gt;&lt;br /&gt;
            # [git]&lt;br /&gt;
            # intree = 1&lt;br /&gt;
hg gexport # Can take quite a long time&lt;br /&gt;
hg push git&lt;br /&gt;
&lt;br /&gt;
# Adding a git mirror repo&lt;br /&gt;
vi conf/gitolite.conf&lt;br /&gt;
git commit conf/gitolite.conf&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
ssh fp@server&lt;br /&gt;
cd fetch&lt;br /&gt;
vi git.list # add &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git clone --mirror &amp;lt;url&amp;gt; &amp;lt;newrepo&amp;gt;&lt;br /&gt;
cd &amp;lt;newrepo&amp;gt;&lt;br /&gt;
git remote add bare cactus@localhost:&amp;lt;newrepo&amp;gt;&lt;br /&gt;
git config --unset remote.bare.fetch&lt;br /&gt;
git push bare --all&lt;br /&gt;
&lt;br /&gt;
# Adding a submodule to the super-repo&lt;br /&gt;
git submodule add &amp;lt;url&amp;gt; &amp;lt;path&amp;gt;&lt;br /&gt;
git commit&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Removing a submodule from the super-repo&lt;br /&gt;
vi .gitmodules&lt;br /&gt;
vi .git/config&lt;br /&gt;
git rm --cached &amp;lt;path&amp;gt;&lt;br /&gt;
git commit ...&lt;br /&gt;
git push&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of &lt;br /&gt;
# the git-svn branch of your mirror and will mess peoples checkout up.&lt;br /&gt;
cd fetch/&amp;lt;repo&amp;gt;&lt;br /&gt;
git status&lt;br /&gt;
git gc&lt;br /&gt;
git filter-branch --msg-filter &amp;#039;sed &amp;quot;s/git-svn-id: http/git-svn-id: https/g&amp;quot;&amp;#039; $(cat .git/packed-refs | awk &amp;#039;// {print $2}&amp;#039; | grep -v &amp;#039;pack-refs&amp;#039;)&lt;br /&gt;
sed -i -e &amp;quot;s/http/https/g&amp;quot; .git/config&lt;br /&gt;
rm -rf .git/svn&lt;br /&gt;
git svn rebase&lt;br /&gt;
git push bare --force&lt;br /&gt;
&lt;br /&gt;
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):&lt;br /&gt;
Edit the svn-remote url URL in .git/config to point to the new domain name&lt;br /&gt;
Run git svn fetch - This needs to fetch at least one new revision from svn!&lt;br /&gt;
Change svn-remote url back to the original url&lt;br /&gt;
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)&lt;br /&gt;
Change svn-remote url back to the new url&lt;br /&gt;
Run git svn rebase should now work again!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2378</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2378"/>
		<updated>2011-06-27T08:35:39Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history.&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  First enter the top-level super-repo directory.  You can get a list of the changes using&lt;br /&gt;
&lt;br /&gt;
  git submodule foreach &amp;#039;git --no-pager log --oneline ..remotes/origin/HEAD&amp;#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This assumes that the remote HEAD is the one that is checked out, which is not true for SimFactory, for example.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoRationale&amp;diff=2377</id>
		<title>GitSuperRepoRationale</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoRationale&amp;diff=2377"/>
		<updated>2011-06-27T08:35:17Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
=Rationale=&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;This section describes the motivations for this project and how our solution addresses problems with the existing systems.&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
==Background==&lt;br /&gt;
&lt;br /&gt;
* Einstein toolkit built from many different components living in their own repositories&lt;br /&gt;
&lt;br /&gt;
* End user must check out each component and compile them together into an executable which is then run to produce output&lt;br /&gt;
&lt;br /&gt;
* End user is often also a developer of some of the components (public or private)&lt;br /&gt;
&lt;br /&gt;
* GetComponents (URL) is a tool to simplify this process by collecting component repository information into a single &amp;quot;CRL&amp;quot; file (CRL = Component Retrieval Language).&lt;br /&gt;
&lt;br /&gt;
* GetComponents allows you to check out the latest versions from a CRL file, or to update an existing set of checkouts to the latest version&lt;br /&gt;
&lt;br /&gt;
==Problems==&lt;br /&gt;
&lt;br /&gt;
* Upstream projects use different version control systems (SVN, Git, Mercurial, ...) leading to a nonuniform experience for the end user/developer.  Multiple tools must be learned for merging/branching/committing etc.&lt;br /&gt;
&lt;br /&gt;
* It is not easy to see at a glance exactly what version of the code is in use.  One could iterate over all the different repositories, of different types, and print the revision information, and any local differences.  This could be added to GetComponents, but this has not been done yet and we argue that this is not the best solution to the problem.&lt;br /&gt;
&lt;br /&gt;
* Knowing what version of the code has been used to produce a given scientific result is essential for the scientific process, where results must be repeatable.  The current best solution to this problem is the Formaline thorn which stores a complete copy of the source code of all thorns in the simulation output directory.  We argue that this is only a partial solution to the problem.  While all the source code is present, the version control metadata has been entirely stripped.  When comparing different simulations, at best one obtains a large diff of all the source changes between them, without information about why they were made or who made them.  There is also no method for conveniently using the formaline output for a new simulation.&lt;br /&gt;
&lt;br /&gt;
* Updating a Cactus source tree is currently an irreversible and dangerous process.  There is no guarantee that the &amp;quot;current&amp;quot; trunk branch of all the components will function correctly, and there is no way, short of a manual backup beforehand, of reverting to the previous state if they don&amp;#039;t.  It is not possible to see, at a glance, exactly what will be updated when you run &amp;quot;GetComponents -u&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
* It is desirable for different members of a scientific research group to be using the same version of the code for production simulations, or at least for this to be possible/easy.  In the current setup, each user is responsible for managing their own Cactus tree and will likely have completely different versions of the code, depending on when they last updated.  It is not even guaranteed that the code can be described by a single &amp;quot;checkout date&amp;quot;, since different components could be checked out at different times.  Users may also have applied patches or altered behaviour, fixing bugs or adding features, to any of the components.&lt;br /&gt;
&lt;br /&gt;
* SVN does not allow distributed version control.  Many components of the ET are in SVN, which means that users cannot use version control locally.  They cannot commit locally frequently and go back to previous versions when there are problems, then bundle up the changes as a coherent commit to upstream.  &lt;br /&gt;
&lt;br /&gt;
* Managing branches is difficult.  Suppose a user wants to implement a new feature.  First, a new branch is created in the corresponding repository (we ignore here the fact that most of the components are in SVN, which does not encourage this mode of development), then the feature is committed bit by bit to that branch.  In the course of development, the user might want to run a production simulation.  So they would switch that repository back to the production branch temporarily.  However, there is no global record of which branch each repository is currently on, and it might be that some repositories are not on &amp;quot;production&amp;quot; branches.  The best solution at the moment is to have a separate production tree, but users rarely have the discipline to do this.&lt;br /&gt;
&lt;br /&gt;
==Proposed solution==&lt;br /&gt;
&lt;br /&gt;
We propose a solution based on the idea of a &amp;quot;Git Super-Repository&amp;quot; with each of the components (thorn repositories) linked into it as submodules (repository pointers).&lt;br /&gt;
&lt;br /&gt;
* A single Git repository represents the complete state of the code&lt;br /&gt;
&lt;br /&gt;
* Each group can set up their own super-repo on their server containing pointers to both the public repositories and their own private ones.&lt;br /&gt;
&lt;br /&gt;
* Any non-git repositories are mirrored on the group&amp;#039;s server (using git-svn, for example) as Git repositories so that users can interact with a single version control system.&lt;br /&gt;
&lt;br /&gt;
* Standard git tools can be used to determine the current revision of the code and any local changes for storing in the simulation output directory for the purpose of reproducibility.&lt;br /&gt;
&lt;br /&gt;
* It is easy to see what branch each repository is on, and to use branches with components which are hosted in SVN&lt;br /&gt;
&lt;br /&gt;
* We ensure that committing back to the upstream repositories is easy&lt;br /&gt;
&lt;br /&gt;
* A &amp;quot;tested&amp;quot; branch can be created in the super-repo.  This branch will only be advanced when the corresponding revision has passed the automated build and test process.  This means that a user can know beforehand that if they use this branch, they will always get a working version of the code.&lt;br /&gt;
&lt;br /&gt;
* Updating is now safe and reversible.  Since the current state is encapsulated in a revision ID, one can easily revert back to it after an update if the code no longer works.&lt;br /&gt;
&lt;br /&gt;
* A group can have a &amp;quot;production&amp;quot; branch in the super-repo (possibly one per project).  Switching to this branch switches all components at the same time, and it can be easily verified that the code is now all on the production branch.  The production branch can be advanced in a controlled way when it has been tested, and all users can update to the new tested version.&lt;br /&gt;
&lt;br /&gt;
* Comparing the codes used to produce two simulations is now easier.  Assuming that the code revision information is present in the output directory, users can simply do a &amp;quot;git diff &amp;lt;rev1&amp;gt; &amp;lt;rev2&amp;gt;&amp;quot; between the two revisions.  They can use standard graphical tools to see the log messages and authors of the commits, or look in full detail at the patches themselves.  The question &amp;quot;did you run with XX fix?&amp;quot; can be trivially answered.  The use of a production branch would also help in this.&lt;br /&gt;
&lt;br /&gt;
* Users have all the benefits of distributed revision control, and the entire version history of all components (including SVN ones) at their fingertips in their local repository copies.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scenarios==&lt;br /&gt;
&lt;br /&gt;
We now describe several scenarios where a standard Cactus checkout provides a poor user experience that is improved by using a Git super-repo.&lt;br /&gt;
&lt;br /&gt;
===Updating a source tree===&lt;br /&gt;
&lt;br /&gt;
A user has a standard Cactus checkout, for example of the Einstein Toolkit.  They last updated it a few months ago, and would like to update it to be &amp;quot;current&amp;quot;.  The current method for doing this is to run GetComponents --update with the corresponding thornlist (assuming that the user has kept it). This will update all the repositories in the tree to the current latest version.  There is no way to see what will be updated (e.g. commit messages of the changes) and no way to revert to the previous state after the update has occurred.  There is no easy way to know whether the latest version of the code passes its test suites.&lt;br /&gt;
&lt;br /&gt;
With a Git super-repository, a user can see the changes that would be obtained on an update:&lt;br /&gt;
&lt;br /&gt;
  git fetch&lt;br /&gt;
  git submodule fetch &amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;I made this up - how would you really do it?&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
  git log --oneline HEAD..FETCH_HEAD&lt;br /&gt;
&lt;br /&gt;
  578f986 Fix indexing in 7th order prolongation&lt;br /&gt;
  b8ab9dc fix testsuites&lt;br /&gt;
  7f10f4b handle the case of only one point in a dimention in the code for the diagonal as well, in a similar way as for the other directi&lt;br /&gt;
  3fc7a5b LoopControl: provide Fortran interface to vectorized loops&lt;br /&gt;
  4f1cbfb CarpetLib: remove superfluous OMP PARALLEL section in (W)ENO prolongation&lt;br /&gt;
  10a7e54 Revert &amp;quot;remove superfluous OMP PARALLEL section in (W)ENO prolongation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Is the HEAD..FETCH_HEAD the simplest way to do this?  How does this work with submodules?&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
The user can then do the update,&lt;br /&gt;
&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
try out the code, and if it doesn&amp;#039;t work, or they decide for some other reason that they want to go back to the old version, they can find that version from&lt;br /&gt;
&lt;br /&gt;
  git reflog&lt;br /&gt;
&lt;br /&gt;
and revert to it:&lt;br /&gt;
&lt;br /&gt;
  git revert --hard &amp;lt;commit&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Does this work with submodules?  --hard is probably wrong - what is the best way to do this?&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In the fetch and pull commands above, the user could specify the &amp;quot;tested&amp;quot; branch which always points to the most recent revision that passes all the testsuites.  This way, the user knows that the version they are getting will compile and pass all tests.&lt;br /&gt;
&lt;br /&gt;
=== Source consistency in a project  ===&lt;br /&gt;
&lt;br /&gt;
Several people are collaborating on a project.  With a standard checkout, there is currently no convenient way to ensure that all the people have the same version of the code when they run simulations for the project.  One of the project members does some development work to try to get something to work, and wants to share that with the other members of the project (but not to commit it upstream, as it is still experimental).  Currently this must be handled with patch files.  Very soon, even if all the project members started off with the same source tree, they will likely have different versions due to local modifications, and no easy way to see what those changes are.&lt;br /&gt;
&lt;br /&gt;
With a Git super-repo, a branch can be easily created in the group&amp;#039;s local repository for the project (one global branch, not one per sub-repository).  Each user can then use&lt;br /&gt;
&lt;br /&gt;
  git log --oneline projectbranch..&lt;br /&gt;
&lt;br /&gt;
to see what commits they have locally that are not on the project branch, and&lt;br /&gt;
&lt;br /&gt;
  git diff&lt;br /&gt;
&lt;br /&gt;
to see their local uncommitted changes across all repositories.  Once the project members agree that certain features are required for the project, these can be pushed to the project branch and all the users can update.  At all times, it is easy to see the difference between each user&amp;#039;s trees.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;How much of this actually works with submodules?&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
=== Identifying whether a fix has been applied for a given simulation ===&lt;br /&gt;
&lt;br /&gt;
One member of a group has a problem with their simulation.  It is crashing and they don&amp;#039;t know why.  They ask around, and someone thinks they may know the cause, and ask what version of the code they are using, specifically whether they have updated a certain thorn to include a particular fix.  Unfortunately, the simulation had been sitting in the queue on a supercomputer for quite a while, and the user has updated their Cactus tree, so they don&amp;#039;t know what version of the code was used to produce the simulation.  With a standard checkout, the user must first find the corresponding fix (e.g. using svn log and svn diff), then untar the correspinding Formaline tarball from the simulation output directory, and see by eye if it looks like the fix has been applied.  If there have been subsequent changes to the file, it might look completely different to when it was fixed, and it might not be easy to tell if the version of the code is from before or after the fix.&lt;br /&gt;
&lt;br /&gt;
With a Git super-repo, the user can look in the simulation output directory where Formaline has stored the Git hash of the version of the code that was used, along with any local changes as patch files.  They can then find the hash of the commit, and look for both in the &amp;quot;git log&amp;quot; output.  If their version comes after the fix, then they know that they were running with the fix already.&lt;br /&gt;
&lt;br /&gt;
=== Determining the cause of differences in a simulation ===&lt;br /&gt;
&lt;br /&gt;
A scientist has a problem.  They have run a new simulation and are getting results they don&amp;#039;t understand.  To track this down, they try to run an old simulation that worked, and find that they get different results.  They now need to determine what has changed in the code between the two simulations.  With a standard Cactus checkout, their only option is to untar all the Formaline tarballs and run a &amp;quot;diff&amp;quot; between the two.  They will see all the source code changes in raw form.  They will not know who has made the changes, or why.  There is no realistic way to unapply a particular suspect commit and test the new version.&lt;br /&gt;
&lt;br /&gt;
With a Git super-repo, the user will look in the simulation output directory and identify the Git hash of each version of the code.  They can then run&lt;br /&gt;
&lt;br /&gt;
  git log --oneline &amp;lt;rev1&amp;gt;..&amp;lt;rev2&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see all the commits which are different between the two versions.  This will show the first line of the log message.  The user can then select one which looks promising and view the patch in detail:&lt;br /&gt;
&lt;br /&gt;
  git log -p &amp;lt;rev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will show the full text of the diff, as well as the full description provided by the author, who is also identified.  Perhaps after some further explanations by the patch author, the user could then revert this single patch&lt;br /&gt;
&lt;br /&gt;
  git revert &amp;lt;rev&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(this creates a new local commit which reverts the old patch) and try the simulation again, and determine if this patch was responsible for the problem or not.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;How much of this actually works with submodules?&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepo&amp;diff=2376</id>
		<title>GitSuperRepo</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepo&amp;diff=2376"/>
		<updated>2011-06-27T08:33:42Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:GitSuperRepo]]&lt;br /&gt;
&lt;br /&gt;
The current method for checking out and updating components of the Einstein Toolkit has several shortcomings.  We propose an additional layer of management around a Cactus tree achieved by storing it in a Git repository.  This provides a uniform version control interface to the code with all the version control information from the source repositories available.  It also allows the entire Cactus tree to be treated as a single repository, and allows &amp;quot;versions&amp;quot; of the code to be identified by a single Git revision.&lt;br /&gt;
&lt;br /&gt;
This project is still in the early stages.  We (Barry Wardell and Ian Hinder) are developing a set of techniques and tools which enable what we consider to be better workflows for using Cactus.  As we use these ourselves, we will learn about what works and what doesn&amp;#039;t, and hopefully will be able to provide recommended workflows for end-users.&lt;br /&gt;
&lt;br /&gt;
==Documents==&lt;br /&gt;
&lt;br /&gt;
* [[GitSuperRepoRationale|Rationale]]&lt;br /&gt;
* [[GitSuperRepoUsersGuide|User&amp;#039;s guide]]&lt;br /&gt;
* [[GitSuperRepoServerGuide|Server administrator&amp;#039;s guide]]&lt;br /&gt;
* [[GitSuperRepoUnsorted|Unsorted information]]&lt;br /&gt;
&lt;br /&gt;
==Progress==&lt;br /&gt;
&lt;br /&gt;
* We have set up a repository which implements most of what is described in the [[GitSuperRepoRationale|Rationale]].&lt;br /&gt;
&lt;br /&gt;
* Repository is updated from the source repositories every hour&lt;br /&gt;
&lt;br /&gt;
==Planned work==&lt;br /&gt;
&lt;br /&gt;
* Figure out some good scripts or git aliases for making working with the submodules more straightforward.&lt;br /&gt;
&lt;br /&gt;
* Set up a public &amp;quot;einsteintoolkit&amp;quot; repository&lt;br /&gt;
&lt;br /&gt;
* Integrate with build-and-test system so that there is always a branch which passes build-and-test&lt;br /&gt;
&lt;br /&gt;
* Implement a technique for storing version control information (revision plus differences) into simulation output&lt;br /&gt;
&lt;br /&gt;
* Update the group repository based on commit emails or an RSS feed rather than hourly&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2374</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2374"/>
		<updated>2011-06-24T05:35:25Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing local modifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history.&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  You can get a list of the changes by&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
	<entry>
		<id>https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2373</id>
		<title>GitSuperRepoUsersGuide</title>
		<link rel="alternate" type="text/html" href="https://docs.einsteintoolkit.org/et-docs/index.php?title=GitSuperRepoUsersGuide&amp;diff=2373"/>
		<updated>2011-06-24T05:27:57Z</updated>

		<summary type="html">&lt;p&gt;Barry.wardell: /* Viewing local modifications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;#039;&amp;#039;Include here simple user-friendly instructions for using a Cactus super-repository&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
We provide a Git super-repo of the Einstein Toolkit.  This page describes how to check it out and work with it.  It is currently more of a tutorial than a User Guide.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Note that these instructions are a work in progress and will not currently work.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;Much of this is too complicated to remember and understand.  We need to make it much simpler, possibly by providing scripts.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Checking out==&lt;br /&gt;
&lt;br /&gt;
  git clone --recursive cactus@git.einsteintoolkit.org:einsteintoolkit Cactus&lt;br /&gt;
&lt;br /&gt;
This takes about 10 minutes and will create a directory called Cactus containing the entire Einstein Toolkit and all its version history.&lt;br /&gt;
&lt;br /&gt;
==Updating==&lt;br /&gt;
&lt;br /&gt;
To update the checkout, it is first a good idea to see what would be changed.  You can get a list of the changes by&lt;br /&gt;
&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
If this is OK, you can then update using:&lt;br /&gt;
&lt;br /&gt;
  cd Cactus&lt;br /&gt;
  git pull&lt;br /&gt;
  git submodule update&lt;br /&gt;
&lt;br /&gt;
==Checking out a specific branch==&lt;br /&gt;
&lt;br /&gt;
If you want to use a particular Einstein Toolkit release, perhaps because the current development version is unstable, use&lt;br /&gt;
&lt;br /&gt;
  git checkout ET_2011_06&lt;br /&gt;
&lt;br /&gt;
The tree will be very quickly updated to match the release.  All changed files will have updated datestamps, so you should be able to trust the Cactus make system to recompile only what is necessary.  However, it might be safer to delete any configurations and build them again.&lt;br /&gt;
&lt;br /&gt;
==Committing==&lt;br /&gt;
&lt;br /&gt;
===Git===&lt;br /&gt;
&lt;br /&gt;
For thorns whose source repositories are in Git already, you can commit and push as normal in the subrepositories.  If they have been cloned from a public URL, as for the Einstein Toolkit URL above, you can use&lt;br /&gt;
&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  git remote add upstream &amp;lt;new-url&amp;gt;&lt;br /&gt;
  git push upstream ...&lt;br /&gt;
&lt;br /&gt;
===SVN===&lt;br /&gt;
&lt;br /&gt;
For subrepositories which are SVN upstream (for example simfactory), you must first initialise the subrepository for committing:&lt;br /&gt;
&lt;br /&gt;
  cd simfactory&lt;br /&gt;
  git checkout trunk&lt;br /&gt;
  git svn init -s --prefix=origin/ svn://...&lt;br /&gt;
&lt;br /&gt;
You can now commit directly to the source SVN repository using&lt;br /&gt;
&lt;br /&gt;
  git svn dcommit ...&lt;br /&gt;
&lt;br /&gt;
assuming you have commit rights in the source SVN repository.&lt;br /&gt;
&lt;br /&gt;
===Mercurial===&lt;br /&gt;
&lt;br /&gt;
For Mercurial upstream repositories, it is more complicated, as there is no git-hg (equivalent to git-svn):&lt;br /&gt;
&lt;br /&gt;
  hg clone &amp;lt;hg-url&amp;gt; &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  cd &amp;lt;submodule-path&amp;gt;-upstream&lt;br /&gt;
  vi .hg/hgrc # Add: &lt;br /&gt;
              # [git]&lt;br /&gt;
              # intree = 1&lt;br /&gt;
              # [path]&lt;br /&gt;
              # git = ../&amp;lt;submodule-path&amp;gt;&lt;br /&gt;
  hg bookmark master -r default&lt;br /&gt;
  hg gexport # Can take quite a long time (~1 hour for carpet-hg)&lt;br /&gt;
  hg pull git # Pull from the git submodule&lt;br /&gt;
  hg push # Push to the upstream hg repo&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:red&amp;quot;&amp;gt;This obviously has to be improved.&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Viewing history==&lt;br /&gt;
&lt;br /&gt;
Each sub-repository is a separate fully-fledged Git repository, so you can go into each one and type &amp;quot;git status&amp;quot;, &amp;quot;git log&amp;quot; etc.  This works for repositories which are SVN upstream, because we use git-svn to convert the repositories to Git on the server.  You can also use the usual graphical tools (we recommend GitX from [http://brotherbard.com/blog/2010/03/experimental-gitx-fork/] for Mac OS, and XXX for Linux) on each subrepository to visualise the log messages and patches, see which files have local changes, and interactively commit parts of files.&lt;br /&gt;
&lt;br /&gt;
==Viewing local modifications==&lt;br /&gt;
&lt;br /&gt;
You can see at a glance which of the submodules have local uncommitted changes using&lt;br /&gt;
&lt;br /&gt;
  git status&lt;br /&gt;
&lt;br /&gt;
You can then go into each submodule and see those changes using git status or git diff.&lt;/div&gt;</summary>
		<author><name>Barry.wardell</name></author>
		
	</entry>
</feed>