Moving to git
Ever since starting my latest client project a few months ago, I’ve started using git. I had the fortune to be trained by a couple git badasses, so it was a pretty smooth transition. At some point, I figured it was time to start porting my own open source projects to git, while keeping the svn repositories current. Here’s a rakefile I worked up to move my own plugins in one command:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# imports all dirs in given SVN dir as a separate git repo in the current directory # pass SERVER= to specify a remote git server. it'll add it as a remote for origin and push master:refs/heads/master task :fetch_plugins do raise "need svn repo in SVN env var" if ENV['SVN'].nil? ENV['GIT'] ||= 'git' repos = %x{svn ls #{ENV['SVN']}}.split repos.each do |repo| next unless repo =~ /\/$/ && !File.exist?(repo) repo.gsub! /\/$/, '' FileUtils.mkdir_p repo error = false Dir.chdir repo do begin puts "initializing #{repo}..." %x{git svn init #{ENV['SVN']}/#{repo}} puts %x{git svn fetch} if ENV['SERVER'] puts %x{git remote add origin #{ENV['GIT']}@#{ENV['SERVER']}:#{repo}.git} puts %x{git push origin master:refs/heads/master} puts %x{git config branch.master.remote 'origin'} puts %x{git config branch.master.merge 'refs/heads/master'} end rescue error = $! end end if error FileUtils.rm_rf repo puts "removing #{repo}: #{error.inspect}" end end end |
If you read through, it does these basic commands:
mkdir pluginname
cd pluginname
git svn init http://pluginurl
git svn fetch
# get some coffee
git remote add origin git@server:pluginname.git
git config branch.master.remote 'origin'
git config branch.master.merge 'refs/heads/master'
git push origin master:refs/heads/master
The last command pushes the local master branch to a master branch on the remote git server. Once that’s done, you should be able to git push/pull without issues. However, there’s something missing from the .git/config file, and in my git newbieness, I have no idea how else to fix: Update – I know how to fix this now. See the git config commands in the rake task. No more need to modify .git/config manually.
[branch "master"]
remote = origin
merge = refs/heads/master
You can setup gitosis on the server to manage the repos. It’s a brilliant piece of software that uses a single ‘git’ user account and public keys to manage access to various repos. The only issue I had with the config file though, was that it required a [repo] entry for every plugin to enable git daemon access. Here’s what I mean:
[group activereload] writable = gitosis-admin lighthouse warehouse darkroom members = caged rick [group mephisto] writable = mephisto members = imajes psq svenfuchs caged rick # enable gitweb [repo mephisto] daemon = yes
You now clone mephisto and the rest of my open source projects with a command like “git clone git://activereload.net/mephisto.git”.
Oh, and merry christmas and all that. I didn’t really intend for this to be “one of those” posts. I’m just having some problems going back to sleep after playing santa (putting out presents, eating the cookies, etc).

by Piyush on 09 Feb 07:42
I am trying to install anaconda as per instructions of the webpage– http://fedoraproject.org/wiki/Anaconda But running————git clone git+ssh://git.fedorahosted.org/git/anaconda.git results in ——-fatal: destination directory ‘anaconda’ already exists.
Running—————git clone ssh://git.fedorahosted.org/git/anaconda.git again results in same—fatal: destination directory ‘anaconda’ already exists.
After going into anaconda directory, when I do——— git push it results in ———-fatal: The remote end hung up unexpectedly immediately Kindly provide a step by step solution for this…I am total newbie with git
Thanks..