Embedding GitHub projects in your svn repository
GitHub is the place to be for sharing code. Unfortunately a lot of companies are still using subversion internally. Luckily, GitHub offers read-only svn access to all repositories (See this April-Fools’-that’s-actually-not-a-joke blogpost from 2010).
This means that you can use svn:externals (http://svnbook.red-bean.com/en/1.0/ch07s03.html) to refer to the main repo instead of exporting code from GitHub and then keeping your own version in svn.
Here’s how I am using this to pull down the official facebook-ios-sdk in our “subversioned” project:
If you don’t have a directory to put your “external” code yet, create one and add/commit it:
mkdir libraries
svn add libraries
svn commit libraries -m "Created libraries dir"
Create the SVN_EDITOR variable if it’s not set already you can choose another editor if you like
export SVN_EDITOR=vi
Set the svn:externals property on your libraries directory:
svn propedit svn:externals libraries
Copy/paste this in the editor
facebook-ios-sdk https://github.com/facebook/facebook-ios-sdk/tags/v1.2/src
Save and quit vi
As you can see in the GitHub url, I’m using the 1.2-tag to avoid build errors when changes are made to the external repo. When there’s a 1.3-tag, I can switch to that one by updating the externals definition using propedit. You can also specify a revision number instead of a tag, if you like.
Don’t forget to commit the libraries-directory so the build-server and your colleagues also have the definition. This will only commit the property on the directory to your repository, not the external code itself.
svn commit libraries -m "Added 'facebook-ios-sdk' externals definition"
Done. When you now update, the external code will also be fetched, so svn update results in:
Fetching external item into 'facebook-ios-sdk'
A facebook-ios-sdk/FBConnect.h
A facebook-ios-sdk/FBDialog.bundle
A facebook-ios-sdk/FBDialog.bundle/images
A facebook-ios-sdk/FBDialog.bundle/images/close.png
A facebook-ios-sdk/FBDialog.bundle/images/close@2x.png
A facebook-ios-sdk/FBDialog.bundle/images/fbicon.png
A facebook-ios-sdk/FBDialog.h
A facebook-ios-sdk/FBDialog.m
A facebook-ios-sdk/FBLoginDialog.h
A facebook-ios-sdk/FBLoginDialog.m
A facebook-ios-sdk/FBRequest.h
A facebook-ios-sdk/FBRequest.m
A facebook-ios-sdk/Facebook.h
A facebook-ios-sdk/Facebook.m
A facebook-ios-sdk/JSON
A facebook-ios-sdk/JSON/JSON.h
A facebook-ios-sdk/JSON/NSObject+SBJSON.h
A facebook-ios-sdk/JSON/NSObject+SBJSON.m
A facebook-ios-sdk/JSON/NSString+SBJSON.h
A facebook-ios-sdk/JSON/NSString+SBJSON.m
A facebook-ios-sdk/JSON/SBJSON.h
A facebook-ios-sdk/JSON/SBJSON.m
A facebook-ios-sdk/JSON/SBJsonBase.h
A facebook-ios-sdk/JSON/SBJsonBase.m
A facebook-ios-sdk/JSON/SBJsonParser.h
A facebook-ios-sdk/JSON/SBJsonParser.m
A facebook-ios-sdk/JSON/SBJsonWriter.h
A facebook-ios-sdk/JSON/SBJsonWriter.m
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.pbxproj
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.xcworkspace
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.xcworkspace/contents.xcworkspacedata
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.xcworkspace/xcuserdata
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.xcworkspace/xcuserdata/mkijewski.xcuserdatad
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/project.xcworkspace/xcuserdata/mkijewski.xcuserdatad/UserInterfaceState.xcuserstate
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/xcuserdata
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/xcuserdata/mkijewski.xcuserdatad
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/xcuserdata/mkijewski.xcuserdatad/xcschemes
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/xcuserdata/mkijewski.xcuserdatad/xcschemes/facebook-ios-sdk.xcscheme
A facebook-ios-sdk/facebook-ios-sdk.xcodeproj/xcuserdata/mkijewski.xcuserdatad/xcschemes/xcschememanagement.plist
A facebook-ios-sdk/facebook_ios_sdk_Prefix.pch
Updated external to revision 119.