123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- Sometimes it's useful to have a repository on your server, which simply mirrors
- some other repository, on another server. Maybe it's easier for you to work with
- it like that, and create forks. Or the repository you want to use it hosted on
- a problematic server, e.g. a centralized hosting service, and you want to make
- the code available on an independent 100% free software powered system.
- # General Procedure
- In general, when creating a local personal mirror outside of Gitolite, the
- following procedure works.
- Create the repo:
- git init --bare
- Configure it:
- git remote add origin URL-HERE
- git config remote.origin.fetch +refs/*:refs/*
- git config fetch.prune true
- Run every hour/day/week to update the mirror:
- git fetch --quiet origin
- # G1thub
- However, Github has additional refs for pull requests, which can create a lot of
- unnecessary clutter and increase repo size.
- The following approach avoid them. However, it misses some namespaces git uses,
- such as notes and replacements. Most of the time they're not used anyway so I
- guess it's reasonable. Also, personally, most of the time I don't interact with
- Github. Anyway these namespaces can be added manually to the configuration if
- needed.
- The commands would be as follows.
- Create the repo:
- git init --bare
- Configure it:
- git remote add origin URL-HERE
- git config remote.origin.fetch +refs/heads/*:refs/heads/*
- git config --add remote.origin.fetch +refs/tags/*:refs/tags/*
- git config fetch.prune true
- Run every hour/day/week to update the mirror:
- git fetch --quiet origin
- # Gitolite
- Now let's see how it's done on a gitolite server.
- Create new empty repo (through gitolite-admin, as described in the previous
- sections of this guide).
- Become the git user (`# su - git`), go to the repository
- (`cd /home/git/repositories/my-mirror.git`) and apply the configuration commands
- on it as listed above (you can use the G1thub specific ones if you mirror a
- G1thub repo).
- Write a simple mirror.sh script to run the periodic update command:
- #!/bin/bash
-
- BASE=/home/git/repositories
-
- cd $BASE/my-mirror.git
- git fetch --quiet origin
- If you have several mirrors, you can extend the script to loop over them and run
- the git fetch command for each. Example:
- #!/bin/bash
-
- BASE=/home/git/repositories
- EXT=.git
-
- MIRRORS="
- bicon
- 4store
- raptor
- rasqal
- librdf
- redland-bindings
- redlandpp
- "
-
- for repo in $MIRRORS
- do
- cd ${BASE}/${repo}${EXT}
- git fetch --quiet origin
- done
- Another option is to go over all repositories, and use git-config to determine
- whether a repository is a mirror, e.g. by checking whether *gitweb.category*
- begins with "Mirror". But then you nee to make sure you assign gitweb categories
- consistently.
- Now become the git user and setup a cron job to run the script periodically
- (`crontab -e -u git`):
- # mail any output to `joe', no matter whose crontab this is
- MAILTO=joe
- # m h dom mon dow command
- # run at 4 AM every day
- 00 04 * * * /home/git/mirror.sh
- `crontab` opens your default text editor (e.g. nano or vim) and lets you add the
- new job. Simply append it to the end of the file.
- If you never used nano or vim - maybe it's time to learn, at least the basics.
- nano is quite simple: Ctrl-O saves, Ctrl-X quits. To learn the basics of vim,
- try `vimtutor`. For simple use it's enough to learn how to insert and delete
- text, how to save and how to quit. Summary:
- - hjkl or arror keys - navigate
- - `i` - (insert mode) type text at cursor position, delete with Backspace
- - Esc - stop insert mode (or any other mode, and go back to main mode)
- - `:w` Enter - save
- - `:q!` Enter - quit without saving
- - `:wq` Enter - quit and save
- Of course you can make Gedit or Kate etc. your default text editor, but then
- you'll be clueless when working on a GUI-less server or using SSH or when things
- crash. It's good to have a basic tool which is always available.
- If you want to read the e-mail sent to you (user *joe*) by cron, add a "local
- mbox" account to your e-mail client, and configure it to read from the file
- `/var/mail/joe`.
|