Difference between revisions of "GitSuperRepoAdminGuide"

From Einstein Toolkit Documentation
Jump to: navigation, search
 
Line 1: Line 1:
 
''Include here a guide to setting up a Git server with a Cactus super-repository''
 
''Include here a guide to setting up a Git server with a Cactus super-repository''
 +
 +
<pre>
 +
 +
###############################################################################
 +
# CactusGit
 +
###############################################################################
 +
 +
# Introduction
 +
 +
# This package allows you to check out Cactus using GetComponents from
 +
# a CRL thornlist using git-svn instead of svn for the svn
 +
# repositories.  This means that your local Cactus tree contains
 +
# complete version information and history and can be managed using
 +
# git rather than svn.
 +
 +
# Further, the package provides tools for creating a
 +
# "super-repository" for the tree with pointers to the downloaded
 +
# repositories as git submodules.  This means that the state of the
 +
# tree can be identified by a single commit ID and can be cloned
 +
# directly without having to use GetComponents or git-svn.
 +
 +
# Notes
 +
# * To make this more convenient, small wrapper scripts can be written
 +
#  to replace the recipes given below
 +
#
 +
# * GetComponents could be extended to support git-svn directly,
 +
#  rather than using the wrapper-script approach that is currently
 +
#  used
 +
 +
# Tutorial
 +
 +
# Add our tools to the path, including the svn wrapper which tricks
 +
# GetComponents into making a git-svn clone of each svn repository.
 +
# We also include a copy of GetComponents here for convenience.
 +
export OLDPATH=$PATH PATH=$PWD/bin:$PATH
 +
 +
# Check out the tree into the Cactus directory (can take a very long
 +
# time, ~60 minutes, and does not show progress for each repository
 +
# until it has checked it out completely)
 +
GetComponents -v -a WaveToy.th
 +
 +
# Now manually checkout any thorns which require authentication
 +
git svn clone ...
 +
 +
# Add the git-svn repos to your server (also add the Cactus super-repo).
 +
crlrepos WaveToy.th > gitsvn.list
 +
cd <gitolite_dir>
 +
vi conf/gitolite.conf # Add the repositories in gitsvn.list
 +
git commit conf/gitolite.conf
 +
git push
 +
 +
# Add a 'fetching and pushing' (fp) user
 +
vi conf/gitolite.conf
 +
git commit conf/gitolite.conf
 +
git push
 +
 +
# Push as the fp user
 +
scp Cactus fp@server:fetch/
 +
scp gitsvn.list fp@server:fetch/
 +
ssh fp@server
 +
cd fetch
 +
for i in `cat gitsvn.list`; do cd $i && git remote add bare cactus@localhost:$i && git config --unset remote.bare.fetch && git config remote.bare.push 'refs/remotes/*:refs/heads/*' && git push bare && cd -; done
 +
 +
# On the server, update the HEAD of the git-svn repos
 +
ssh cactus@server
 +
cd ~/repositories
 +
for i in `cat ../fetch/gitsvn`; do cd $i.git && git symbolic-ref HEAD refs/heads/git-svn && cd -; done
 +
 +
# Generate a super-repository called CactusGit using all the
 +
# repositories from Cactus listed in WaveToy.th
 +
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th
 +
 +
# Add non-svn repos
 +
GetComponents Llama.CTGamma.ET.th
 +
rm -rf repos
 +
git submodule add ... repos/...
 +
 +
# Symlink flesh
 +
ln -s flesh/CONTRIBUTORS
 +
ln -s flesh/COPYRIGHT
 +
ln -s flesh/Makefile
 +
ln -s flesh/doc
 +
ln -s flesh/lib
 +
 +
# Commit symlinks (as fp)
 +
git add *
 +
git commit ...
 +
git push cactus@localhost:Cactus master:master
 +
 +
######### Administrators ########
 +
# Updating the git-svn mirrors
 +
for i in `cat gitsvn.list`; do cd $i; git svn fetch && git push bare; cd -; done
 +
 +
# Updating the hg-git mirrors
 +
for i in `cat githg.list`; do cd $i; hg pull && hg push git; cd -; done
 +
 +
# Updating the git mirrors
 +
for i in `cat git.list`; do cd $i; git fetch -a -u && git push bare --all; cd -; done
 +
 +
# Updating all submodules in the super-repo
 +
cd Cactus
 +
git pull
 +
git submodule foreach git pull
 +
git commit -m "Update submodules." -a
 +
 +
# Updating a single submodule in the super-repo
 +
cd Cactus
 +
cd <repo-path>
 +
git pull
 +
cd -
 +
git commit -m "Update submodule <repo-path>." <repo-path>
 +
 +
# Automatic updates of super-repo
 +
git clone --recursive cactus@localhost:Cactus
 +
cd Cactus
 +
git submodule foreach 'git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK'
 +
git remote set-url origin /var/cactus/repositories/Cactus
 +
git remote set-url --push origin cactus@git.barrywardell.net:Cactus
 +
git checkout submodules
 +
git pull origin submodules
 +
git submodule foreach 'git fetch origin && git checkout origin'
 +
git commit -m "Update submodules." -a
 +
git push origin submodules
 +
 +
# Adding a git-svn repo
 +
vi conf/gitolite.conf
 +
git commit conf/gitolite.conf
 +
git push
 +
 +
ssh fp@server
 +
cd fetch
 +
vi gitsvn.list # add <newrepo>
 +
git svn clone -s <url> <newrepo>
 +
cd <newrepo>
 +
git remote add bare cactus@localhost:<newrepo>
 +
git config --unset remote.bare.fetch
 +
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
 +
git push bare
 +
cd ~/repositories/<newrepo>
 +
git symbolic-ref HEAD refs/heads/trunk
 +
cd ~/fetch/<newrepo>
 +
git pull bare
 +
 +
# Adding a hg-git repo
 +
vi conf/gitolite.conf
 +
git commit conf/gitolite.conf
 +
git push
 +
 +
ssh fp@server
 +
cd fetch
 +
vi githg.list # add <newrepo>
 +
hg clone <url> <newrepo>
 +
cd <newrepo>
 +
vi .hg/hgrc # Add:
 +
            # [path]
 +
            # git = git+ssh://localhost/<newrepo>
 +
            # [git]
 +
            # intree = 1
 +
hg gexport # Can take quite a long time
 +
hg push git
 +
 +
# Adding a git mirror repo
 +
vi conf/gitolite.conf
 +
git commit conf/gitolite.conf
 +
git push
 +
 +
ssh fp@server
 +
cd fetch
 +
vi git.list # add <newrepo>
 +
git clone --mirror <url> <newrepo>
 +
cd <newrepo>
 +
git remote add bare cactus@localhost:<newrepo>
 +
git config --unset remote.bare.fetch
 +
git push bare --all
 +
 +
# Adding a submodule to the super-repo
 +
git submodule add <url> <path>
 +
git commit
 +
git push
 +
 +
# Removing a submodule from the super-repo
 +
vi .gitmodules
 +
vi .git/config
 +
git rm --cached <path>
 +
git commit ...
 +
git push
 +
 +
# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of
 +
# the git-svn branch of your mirror and will mess peoples checkout up.
 +
cd fetch/<repo>
 +
git status
 +
git gc
 +
git filter-branch --msg-filter 'sed "s/git-svn-id: http/git-svn-id: https/g"' $(cat .git/packed-refs | awk '// {print $2}' | grep -v 'pack-refs')
 +
sed -i -e "s/http/https/g" .git/config
 +
rm -rf .git/svn
 +
git svn rebase
 +
git push bare --force
 +
 +
# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):
 +
Edit the svn-remote url URL in .git/config to point to the new domain name
 +
Run git svn fetch - This needs to fetch at least one new revision from svn!
 +
Change svn-remote url back to the original url
 +
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)
 +
Change svn-remote url back to the new url
 +
Run git svn rebase should now work again!
 +
 +
######### Regular Users #########
 +
# Cloning is easy
 +
git clone --recursive cactus@server:Cactus
 +
 +
# Update a clone
 +
# Note that because there might have been local
 +
# changes to the repos when you do the pull, the submodules will not
 +
# be on any branch, for safetly
 +
cd Cactus
 +
git pull
 +
git submodule update
 +
 +
# To enable svn commits from any of the submodules
 +
git checkout trunk
 +
git svn init -s --prefix=origin/ svn://...
 +
git svn dcommit ...
 +
 +
# To enable hg pushes from any of the submodules
 +
# In principal, we could do this on the server-end
 +
# so that regular users just push to our git-hg mirror
 +
# and we have a hook which pushes this upstream to
 +
# the original hg repository.
 +
hg clone <hg-url> <submodule-path>-upstream
 +
cd <submodule-path>-upstream
 +
vi .hg/hgrc # Add:
 +
            # [git]
 +
            # intree = 1
 +
            # [path]
 +
            # git = ../<submodule-path>
 +
hg bookmark master -r default
 +
hg gexport # Can take quite a long time (~1 hour for carpet-hg)
 +
hg pull git # Pull from the git submodule
 +
hg push # Push to the upstream hg repo
 +
 +
# To enable git pushes from submodules which were cloned from a public URL
 +
cd <submodule-path>
 +
git remote add upstream <new-url>
 +
git push upstream ...
 +
 +
 +
 +
</pre>

Revision as of 05:21, 24 June 2011

Include here a guide to setting up a Git server with a Cactus super-repository


###############################################################################
# CactusGit
###############################################################################

# Introduction

# This package allows you to check out Cactus using GetComponents from
# a CRL thornlist using git-svn instead of svn for the svn
# repositories.  This means that your local Cactus tree contains
# complete version information and history and can be managed using
# git rather than svn.

# Further, the package provides tools for creating a
# "super-repository" for the tree with pointers to the downloaded
# repositories as git submodules.  This means that the state of the
# tree can be identified by a single commit ID and can be cloned
# directly without having to use GetComponents or git-svn.

# Notes
# * To make this more convenient, small wrapper scripts can be written
#   to replace the recipes given below
#
# * GetComponents could be extended to support git-svn directly,
#   rather than using the wrapper-script approach that is currently
#   used

# Tutorial

# Add our tools to the path, including the svn wrapper which tricks
# GetComponents into making a git-svn clone of each svn repository.
# We also include a copy of GetComponents here for convenience.
export OLDPATH=$PATH PATH=$PWD/bin:$PATH

# Check out the tree into the Cactus directory (can take a very long
# time, ~60 minutes, and does not show progress for each repository
# until it has checked it out completely)
GetComponents -v -a WaveToy.th

# Now manually checkout any thorns which require authentication
git svn clone ...

# Add the git-svn repos to your server (also add the Cactus super-repo).
crlrepos WaveToy.th > gitsvn.list
cd <gitolite_dir>
vi conf/gitolite.conf # Add the repositories in gitsvn.list
git commit conf/gitolite.conf
git push

# Add a 'fetching and pushing' (fp) user
vi conf/gitolite.conf
git commit conf/gitolite.conf
git push

# Push as the fp user
scp Cactus fp@server:fetch/
scp gitsvn.list fp@server:fetch/
ssh fp@server
cd fetch
for i in `cat gitsvn.list`; do cd $i && git remote add bare cactus@localhost:$i && git config --unset remote.bare.fetch && git config remote.bare.push 'refs/remotes/*:refs/heads/*' && git push bare && cd -; done

# On the server, update the HEAD of the git-svn repos
ssh cactus@server
cd ~/repositories
for i in `cat ../fetch/gitsvn`; do cd $i.git && git symbolic-ref HEAD refs/heads/git-svn && cd -; done

# Generate a super-repository called CactusGit using all the
# repositories from Cactus listed in WaveToy.th
crltogit CactusGit cactus@server: Llama.CTGamma.ET.th

# Add non-svn repos
GetComponents Llama.CTGamma.ET.th
rm -rf repos
git submodule add ... repos/...

# Symlink flesh
ln -s flesh/CONTRIBUTORS
ln -s flesh/COPYRIGHT
ln -s flesh/Makefile
ln -s flesh/doc
ln -s flesh/lib

# Commit symlinks (as fp)
git add *
git commit ...
git push cactus@localhost:Cactus master:master

######### Administrators ########
# Updating the git-svn mirrors
for i in `cat gitsvn.list`; do cd $i; git svn fetch && git push bare; cd -; done

# Updating the hg-git mirrors
for i in `cat githg.list`; do cd $i; hg pull && hg push git; cd -; done

# Updating the git mirrors
for i in `cat git.list`; do cd $i; git fetch -a -u && git push bare --all; cd -; done

# Updating all submodules in the super-repo
cd Cactus
git pull
git submodule foreach git pull
git commit -m "Update submodules." -a

# Updating a single submodule in the super-repo
cd Cactus
cd <repo-path>
git pull
cd -
git commit -m "Update submodule <repo-path>." <repo-path>

# Automatic updates of super-repo
git clone --recursive cactus@localhost:Cactus
cd Cactus
git submodule foreach 'git remote set-url origin /var/cactus/repositories/$path cactus@git.barrywardell.net:/$path; echo OK'
git remote set-url origin /var/cactus/repositories/Cactus
git remote set-url --push origin cactus@git.barrywardell.net:Cactus
git checkout submodules
git pull origin submodules
git submodule foreach 'git fetch origin && git checkout origin'
git commit -m "Update submodules." -a
git push origin submodules

# Adding a git-svn repo
vi conf/gitolite.conf
git commit conf/gitolite.conf
git push

ssh fp@server
cd fetch
vi gitsvn.list # add <newrepo>
git svn clone -s <url> <newrepo>
cd <newrepo>
git remote add bare cactus@localhost:<newrepo>
git config --unset remote.bare.fetch
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
cd ~/repositories/<newrepo>
git symbolic-ref HEAD refs/heads/trunk
cd ~/fetch/<newrepo>
git pull bare

# Adding a hg-git repo
vi conf/gitolite.conf
git commit conf/gitolite.conf
git push

ssh fp@server
cd fetch
vi githg.list # add <newrepo>
hg clone <url> <newrepo>
cd <newrepo>
vi .hg/hgrc # Add: 
            # [path]
            # git = git+ssh://localhost/<newrepo>
            # [git]
            # intree = 1
hg gexport # Can take quite a long time
hg push git

# Adding a git mirror repo
vi conf/gitolite.conf
git commit conf/gitolite.conf
git push

ssh fp@server
cd fetch
vi git.list # add <newrepo>
git clone --mirror <url> <newrepo>
cd <newrepo>
git remote add bare cactus@localhost:<newrepo>
git config --unset remote.bare.fetch
git push bare --all

# Adding a submodule to the super-repo
git submodule add <url> <path>
git commit
git push

# Removing a submodule from the super-repo
vi .gitmodules
vi .git/config
git rm --cached <path>
git commit ...
git push

# Changing svn URL for a git-svn clone. WARNING: this is rewriting the history of 
# the git-svn branch of your mirror and will mess peoples checkout up.
cd fetch/<repo>
git status
git gc
git filter-branch --msg-filter 'sed "s/git-svn-id: http/git-svn-id: https/g"' $(cat .git/packed-refs | awk '// {print $2}' | grep -v 'pack-refs')
sed -i -e "s/http/https/g" .git/config
rm -rf .git/svn
git svn rebase
git push bare --force

# Changing svn URL without rewriting history (https://git.wiki.kernel.org/index.php/GitSvnSwitch):
Edit the svn-remote url URL in .git/config to point to the new domain name
Run git svn fetch - This needs to fetch at least one new revision from svn!
Change svn-remote url back to the original url
Run git svn rebase -l to do a local rebase (with the changes that came in with the last fetch operation)
Change svn-remote url back to the new url
Run git svn rebase should now work again!

######### Regular Users #########
# Cloning is easy
git clone --recursive cactus@server:Cactus

# Update a clone
# Note that because there might have been local
# changes to the repos when you do the pull, the submodules will not
# be on any branch, for safetly
cd Cactus
git pull
git submodule update

# To enable svn commits from any of the submodules
git checkout trunk
git svn init -s --prefix=origin/ svn://...
git svn dcommit ...

# To enable hg pushes from any of the submodules
# In principal, we could do this on the server-end
# so that regular users just push to our git-hg mirror
# and we have a hook which pushes this upstream to
# the original hg repository.
hg clone <hg-url> <submodule-path>-upstream
cd <submodule-path>-upstream
vi .hg/hgrc # Add: 
            # [git]
            # intree = 1
            # [path]
            # git = ../<submodule-path>
hg bookmark master -r default
hg gexport # Can take quite a long time (~1 hour for carpet-hg)
hg pull git # Pull from the git submodule
hg push # Push to the upstream hg repo

# To enable git pushes from submodules which were cloned from a public URL
cd <submodule-path>
git remote add upstream <new-url>
git push upstream ...