Difference between revisions of "GitSuperRepoAdminGuide"
| 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 ...