Let's assume it is a website ("mysite"), and we have three machines involved:
devel: where most development is done
store: the central repository server
www: the web server
The website is on devel currently, under git, and we want to check it out to www.
If not a website, but just two developers, then in this example "www" is the machine of that second developer.
For simplicity we'll assume all developers have ssh access to the "store" machine. And that all our git repositories will be kept under /var/git/
1. On store:
cd /var/git/
mkdir mysite.git
cd mysite.git
git init --bare
(see update#1 below, if your git does not support --bare)
2. On devel (from the root of the website)
git remote add origin darren@store:/var/git/mysite.git
git push origin master
(the "origin master" part is just needed the first time)
3. On www,
cd /var/www/
git clone darren@store:/var/git/mysite.git my.example.com
(this creates /var/www/my.example.com and checks out the current version of the site)
(you need to configure your web server to not serve the .git directory, as well as any other files end users should not see)
4. If we make a change on devel and want to update www.
First on devel, do the commits, then:
git push
Then on www:
git pull
5. If we make a change on www, and want to update devel.
First on www, do the commits, then:
git push
Then on devel do:
git pull origin master
Not quite symmetrical is it? To fix this, so in future you just need to do "git pull" from the devel machine too, edit .git/config. You'll see these lines:
[remote "origin"]
url = darren@store:/var/git/mysite.git
fetch = +refs/heads/*:refs/remotes/origin/*
Don't touch them but, just above them, add this block:
[branch "master"]
remote = origin
merge = refs/heads/master
(unless you are doing something clever, you can use that verbatim). Now "git pull" works without having to specify "origin master" any more.
So, "git commit ...;git push" is like "svn commit ...". And "git pull" is like "svn checkout".
UPDATE #1: Older versions of git don't have the --bare function. Do these steps (on "store" machine) instead:
cd /var/git/ mkdir mysite.git cd mysite.git git init mv .git/* . rmdir .git
UPDATE #2: What to do if you already have some files on www, with some differences from what is in git? E.g. I had a test and live version of a website, with no source control; the test version had a number of extra files. I scp-ed the live version to devel, created a git repository. Then I set it up and push-ed it to "store". Then on my test site, I had to do these steps:
By the end of all this, git status will just list (as untracked) the files that were on test but were not on live.#Temporarily move current test files out of the way mv my.example.com{,.old} #Get the git version git clone darren@store:/var/git/mysite.git my.example.com #Merge in the test site cd my.example.com cp -a ../my.example.com.old/* . #See what is different git status #For all changed files, revert to the git (live server) version git reset --hard