Friday, March 20, 2009

Version Control is Your Friend

Most new developers, especially those with no serious intentions of becoming a professional programmer, generally think of version control software as being something that they don't need. Heck, I resisted using it for a long time even after programming became my livelihood because on most of my projects, I was the sole developer. Concurrency just isn't an issue with one developer, right?

Well, yes, that's true. But, version control is still worth using even if you're a sole developer. Putting your projects under version control gives you the ability to "undo" past the time you last opened Xcode. It keeps a record of what your code has looked like over time, and gives you an extra level of backup. Accidentally throw your project in the trash and empty it? No worries, just check-out a new version. (Note: version control is not a substitute for a backup plan!)

And, everything you need to use version control is already on your hard drive, and Xcode knows all about version control, so it's not exactly hard to use. Let's walk through putting a project under source control, shall we?

Note: I know a lot of people love git. Although I'm not personally, some of git's features are really great. But, for single-developer projects, git doesn't provide any real advantages, and you lose Xcode integration. As a result, I'm sticking with subversion for this tutorial.

Choosing a Repository Location


All source control systems store their data in something called a "repository". The first decision you must make before using version control is where to put your subversion repository. I choose to put mine on an external hard drive because it gives me an extra level of backup redundancy. My working source code is always on my MacBook Pro's internal hard drive. I have a separate external hard drive for nightly backups, and a second external hard drive that I use for my code repositories and a few other things (like my iTunes & iPhoto libraries). That means my project is on three different physical devices, meaning I'm that much less-likely to suffer a catastrophic loss. I could (and plan to someday) make things even better by backing up to a remote location.

You don't necessarily need to have your repository on a separate hard drive, however. You can put it right on your main, internal hard drive, and you will still get benefits. The best option, in many ways, is to use a remote subversion repository, however setting one of those up is a lot more work than a local one so we're going to stick with local file repositories for this tutorial. There's no difference in using a local or remote repository, other than the format of the URL you use, so after this, you should be able to set up to use Subversion-based services like Google Code.

If you're going to need to access the source code from more than one account, creating a directory at /Users/Shared/subversion is a good choice for holding your repository.

Repositories can hold multiple projects, although many developers prefer to have a separate repository for each project. The choice is yours.

Creating the Repository


Creating the repository is very easy. Open up Terminal.app, navigate to the directory where you want to create the repository, and type svnadmin create [project name]. After you do that, you need to make sure that all people who need access to the repository have read, write, and execute privileges on it. So, if you wanted to create a repository called HelloWorld at /Users/Shared/subversion, you would execute the following commands:

cd /Users/Shared
mkdir subversion
cd subversion
mkdir HelloWorld
svnadmin create HelloWorld
chmod -R 777 HelloWorld

Note, that you could substitute something like chmod -R 770 HelloWorld if you're the only one who's ever going to access the repository.

Setting up the Standard Subversion Directories


Although it's not required or enforced, there is a generally-accepted "right way" of setting up a Subversion repository. By default, a Subversion repository has three directories:

  • trunk - where all the source code is stored

  • branches - a branch is a specific version of the source code. These are just copies (actually, more like symbolic links or aliases) to specific versions of the source code in trunk. So, you might have two branches representing the current development version and the current release version, or you might have different ones for each dev release.

  • tags - Tags are exactly like branches, as far as Subversion is controlled - they're snapshots of a given version of your source code. Tags are often used for specific releases, so you might have a directory under tags called Release-1.0 that holds a copy of the code that was used to create the first shipped version of your application


As a sole developer, you may not use branches or tags when you first start using version control. It's still a good idea to set up these standard directories in case you decide you want that functionality in the future. Also, if you ever decide to open-source your application and make it available through Google Code or SourceForge, other developers are going to expect those standard directories.

To create the directories, you don't use the standard mkdir directory, but you use a similar command issued through the svn commandline tool. To create the tags directory in our HelloWorld project above, you would execute the following command:

svn mkdir file:///Users/Shared/Subversion/HelloWorld/trunk file:///Users/Shared/Subversion/HelloWorld/branch file:///Users/Shared/Subversion/HelloWorld/tag

After you type that, it's going to prompt you for a comment. You can leave it blank, or type something like "setting up standard subversion directories". By default, subversion t will probably use vi or emacs to solicit the comment from you. Here's a little tip: if you're a Textmate user like me, set the environment variable SVN_EDITOR to the value mate -w in your bash profile (bash users) or .cshrc file (tcsh users) and it will prompt you for the comment using Textmate instead of a command-line editor. You can also set the environment variable EDITOR to the same value and that will cause several other standard unix programs to use Textmate for text editing rather than one of the standard unix editors.

Once you type your comment, save and exit the editor (or close the window if you're in Textmate), it will add the three directories to your repository.

Telling Xcode about the Repository


Next, launch Xcode and select Preferences from the Xcode menu. When the window comes up, scroll the top pane all the way to the right. The second to last item is SCM. SCM stands for "Software Configuration Management", and is a fancier term for version control. Click that icon and you'll get a window that looks like this:



Click the little icon in the lower left corner to add a repository. You will be prompted for a name and to specify what SCM (version control) system you're using. The name here does not have to match the name you used in your repository. Select Subversion as your SCM system, and type "Hello World" for the name.


Hit return, and it will create a new repository. Configure this by typing the following URL into the URL field (it will extract the rest of the fields it needs from the URL):

file:///Users/Shared/subversion/HelloWorld

After you do that, your window should look like this:



Make sure you see the little green dot and the word "authenticated" below the text fields. That is your indication that it found the repository. If you don't see that, check the URL to make sure you didn't mistype anything.

You can now hit the OK button and close the preferences window. Let's now import an existing project into version control. If you want to play along at home, create a new iPhone application from the View-Based Application template and call it "Hello World". You don't need to make any changes, but when you're done, do close the Xcode project window.

Importing an Xcode Project into the Repository


Still in Xcode, select Repositories from the SCM menu. It should bring up a window that looks like this:


Click on the folder called trunk, then select the Import button from the toolbar. Navigate to and select "Hello World" project Folder.


Now your project is under source control, but, the project in its original location doesn't know it. We need what's called a "working copy" of the code. A working copy has invisible files that connect it to the repository. So, go drag the original project to the trash. Yeah, I'm serious. Go throw it away. Once you've done that, select Hello World under trunk in Xcode's repository window, and press the Checkout button in the toolbar. It will prompt you for a location. Select where you want the project and click the Checkout button. After it saves it, it will prompt you to open the project:


Select Open Hello World.xcodeproj and Xcode will open up the project, which is now under source control.

Not Quite Done Yet


From Xcode's Project menu, select Project Settings…. Look for a popup menu near the bottom called SCM Repository. Click on that and select Hello World (Subversion) - Recommended.


Once you've done that, a new column will appear in your project's Groups & Files Pane, and your project is ready to be worked with. That new column tells you the status of the file it is next to. If that column next to a specific file is empty, then that file has not been changed since it was last checked in. If it has question mark, the file needs to be added to the repository. If it has an M, then the file has been modified since last check-in. If it has an A next to it, it will be added to the repository next time you check in your changes.

When you add files to your project, you can select them and choose Add to Repository from the SCM menu. To commit your changes to the repository (aka "check them in"), select Commit Changes… from the SCM menu. If you decide you don't like the changes you've made, you can select Discard Changes... which will rollback your project to match the last version checked into the repository.

There are also other options in the SCM menu. You can compare different versions, update to a specific version, and look at annotations for different revisions. A full coverage of the capabilities of Subversion is beyond the scope of this article, but there is a great, free book that covers all aspects of using Subversion for version control You can get it here.



44 comments:

mhdsci said...

*laughs* well damit! this post would have been helpful literally 5 minutes ago, when I changed something on my code/program/IBOutlets/Connections ... and broke my program. Only I haven't been able to figure out what I changed yet. Thanks for the post, will be implementing shortly.

Adrian Kosmaczewski said...

I'm a git fan, I'm sorry :) This is not to say that Subversion is not great; actually I'm a big fan of it and I've even written a tutorial (in Spanish) in my blog about it:
http://kosmaczewski.net/2007/01/01/subversion-1/

Although you mention git at the beginning, I must disagree about the lack of advantages for the individual developer; git branches are ahead of anything Subversion will ever be able to accomplish (more flexible, cheap and easier to merge); the same goes for the git stash (which is like a temporary buffer for uncommitted stuff) or the ability to export the current revision in tarballs or zip files with one line. Not to mention the fact that you get all your log history offline, all the time, with you, and the fact that the repositories are tremendously efficient in terms of disk space.

Best of all, you don't need to setup a server; but if you need one, github.com provides a great way to store your projects, for 7 bucks a month you can have private repositories too. Check out my own projects at http://github.com/akosma ;)

Of course you lose the Xcode integration (at least until Apple adds git support to it, which I'm sure is in the works), but there's an excellent TextMate plugin, and I must admit that the command line is one of my best friends.

As for Xcode projects, a simple .gitignore file with the following entries is all you need (this is the equivalent of Subversion's externals):

build
*.pbxuser
*.mode2v3

Just my 2 cents! Excellent article, as usual!

Jeff LaMarche said...

Adrian:

No reason to be sorry, git's cool, just don't find it's advantages compelling based on my needs, certainly not enough to justify the extra work. Git is, bottom line, more work. It's a tool created by people who like to build their own PC and tweak with their OS' kernel. Almost every task takes more typing, more work. That might be something I'd put up with if I needed the advantages git has, but I don't. Subversion works great for me. I like it, I'm comfortable with it. Because I don't choose to use git doesn't mean I hate it. It just means I don't use it. :)

Have no desire to start a holy war over it. For people who want to use git, there are many tutorials out there on it.

Quinn Taylor said...

@Adrian

I have quite a few friends who are fans of git/Mercurial/Bazaar (roughly in that order) and they rave about the features. I'm all in favor of people using what works best for them. My opinion is still that SVN offers the lowest ratio of learning curve to functionality gained. DVCS systems generally appeal most to experienced developers--remember that not everyone works best while keeping a plethora of branches in their head.

As far as Xcode integration, that would be nice, but it's a pipe dream as long as git and Mercurial are under GPL, which has a viral effect of causing any project that directly links to it to (legally) become open-source as well. I can't see Apple doing that with Xcode. It would be a different story if it were a BSD/MIT/Apache-style license, but the people behind the software tend towards the "open source only" end of the spectrum. Sure, "fighting the man" with GPL'd projects makes sense sometimes, but in the case of a VCS, it's short-sighted.

Mark Johnson said...

Handy article, thanks. When you are in the middle of a big app update and you find a horrible bug that's in the app store version right now, even a sole developer will want to branch.

Stuart said...
This comment has been removed by the author.
cjr said...

One thing I always do before adding my project to an svn repository is to remove the build directory...

Jeff LaMarche said...

Stuart:

I'm hardly afraid of the command line. I do a lot of work on the command line and am quite a fan of how powerful it can be. Hell, much of my professional life for half a decade was spent on the command line.

I also don't need to be tutored on git - I've looked at it. I've tried it. It's not hard to learn, but I find it less intuitive than either Subversion or cvs with few advantages. Saying it's less intuitive and less elegant is hardly the same as saying it's impossible to learn. It has a few advantages over Subversion, but none that I personally have much need for. Therefore, for me, it's not worth taking the time to become good with git.

That's the key right there -FOR ME. Okay? Y'know, the guy writing the blog. I've given git a fair looking at and I prefer Subversion. Why do git zealots take that as such a personal affront? Why can't I do a Subversion tutorial without a handful of people coming to my blog and telling me I'm wrong for using Subversion and trying to convince me I should use git or convince my readers that I'm somehow ignorant for showing them how to use Subversion?

Can you please give me some credit and accept that I may have looked at the software and may have made an informed decision based on my own personal needs? Can't you accept that my needs may be different than yours and that that doesn't invalidate my opinion?

You pasting a bunch of git commands doesn't change my opinion of git being less intuitive than Subversion. Does that mean it's not as good? No. It just means that for me, Subversion suits my needs better. End of story.

God. It's JUST version control software, it's not a religion. Can't you let it be? You're more than welcome to do a tutorial on git for Xcode developers if you want. I promise I won't come to your blog and tell you that you should be using Subversion.

Simply put, I don't want to go to the command line unnecessarily. I spend most of my programming life in Xcode. I want to be able to commit from within Xcode. I don't want to command-tab to the command line, then type in a command, then command-tab back. I don't want to drop to the command line to see if a particular file has changes since last check in, I just want to look at the file and know. I get all that with Subversion, not with git.

Therefore, for me, git's got to offer huge advantages to make it worth using. I like to commit several times a day, before any kind of refactoring, and also at the end of each coding session. Yes, it's only a short bit of time each time I want to commit, check the status, rollback, or diff, but it's time I don't want to spend if I don't have to.

I readily admit that there are a handful of advantages to git, I just don't think those advantages are substantial enough to justify giving up the Xcode integration, especially on single-developer projects.

If Xcode ever adds support for git, my opinion my change. Until then, I'm probably going to stick with Subversion as my main SCM client, and will probably continue to recommend it to other Xcoders.

Jeff LaMarche said...

cjr:

You can also add "build" to your global ignores in your subversion config file, which is typically located at

~/.subversion/config

My global ignore line looks like this:

global-ignores = *.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store build *~.nib *.so *.pbxuser *.mode* *.perspective*

That also excludes the user-specific Xcode settings and the nasty .DS_Store files.

Stuart said...

@Jeff,

Please do accept my apology, as my comment was not directed at you personally - nor was there any implication about your skills as a software engineer or that you had a lack of understanding of the command line. Do you think I'd be around here if I didn't appreciate your blog!

Believe me, I'm the first to jump at anyone for telling me I'm wrong or not entitled to my own opinion.

I will take up your suggestion about creating a post on using Git with XCode, rather than ramble here.

Please feel free to delete the previous comment, and I'll contribute more constructively and in context now and in the future:

Thanks for the great post on using SVN with XCode :-)

lunaticrobot said...

Hi Jeff - I bought your book and it's been a big help! I just tried to set up svn as you described but ran into a few problems. First problem occurred after the:

svn mkdir file:// ...

command. Apparently before you can enter a comment, you should make sure you have an editor chosen for svn to use. An error message stating the following occurred after the svn mkdir:

svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options

I then set SVN_EDITOR in my shell as:

export SVN_EDITOR=vi

But I still had a problem. After re-entering the svn mkdir command, vi started up and I entered a comment similar to what you suggested but I next saw this error:

svn: Unable to open an ra_local session to URL
svn: Local URL 'file://Users/myUserName/Documents/programming/iPhone/subversion' contains unsupported hostname
svn: Your commit message was left in a temporary file:
svn: 'svn-commit.tmp'

I'm not really sure what this means but google will probably turn up something. In the meantime, you may want to run through the process with a virgin user account to see what other issues may crop up.

Thanks for the posts!

lunaticrobot said...

OK - I made a typo in my URL above - left out the third '/'. So I fixed that and come to this error now:

svn: Unable to open an ra_local session to URL
svn: Unable to open repository 'file:///Users/myUserName/Documents/programming/iPhone/subversion'
svn: Your commit message was left in a temporary file:
svn: 'svn-commit.2.tmp'

Is this because I need to give SVN rw access to my home directory? I'd rather not lower my directory permissions for SVN if I can avoid it.

lunaticrobot said...

OK- it wasn't a permissions problem. It seems that svn didn't like me giving it three URL's on the same svn mkdir line as in your example. Doing three separate commands for the trunk, branch, and tag directories worked.

Adrian Kosmaczewski said...

I feel a bit guilty of having somehow started the whole git thread. Sorry Jeff! I didn't mean to. As I said, svn is a great system and I still use it in many projects (just to tell you, I even kept the whole material I wrote for my Master's degree in a huge svn repository :). I don't like religious wars either :) Cheers and keep it up Jeff!

M. Rohrmoser said...

Hi Jeff, nice article. Inspired me to blog myself http://blog.mro.name/2009/03/re-version-control-is-your-friend/

And to the git taliban out there: cool down a bit, if you want to, use git on top a svn repo.

P.S.: a couple of days ago I read your great book "Beginning iPhone development". Congrats.

Henning said...

My hosting provider is Dreamhost, and they (as well as others, I'm sure) provide a really easy way to create SubVersion repositories. So I have a remote and private repository hosted by DH, and it works great.

Edu said...

For those who host their projects in Google and what to use Subversion 1.5, this post is essential (from Lemon Team’s blog): http://www.lemonteam.com/blog/2008/12/setting-up-subversion-15-on-xcode/

hope it helps.

Bill Shirley said...

I forego xCode's SCM client for Versions. But not using revision control is NOT an option!

One of the most obvious and useful things I've used it for is tracking down regression bugs. Check out older and older versions until the bug doesn't happen. Then walk through the code that was changed.

If you treat the trunk and fungible and sloppy (which you definitely should with only 1 or 2 developers), then you should check in frequently, aiming to be buildable and runnable, but not freaking out if it isn't.

Smaller check-ins lead to smaller diffs, and less code to check for that regression bug.

(There are many other influences that might lead to being more strict about trunk check-ins.)

hock said...

Good posting! more professional web templates at itemplatez.com... its a
easy download.

Robert Conn said...

Excellent post - got my Subversion repository sorted very quickly following this.

I had to revert some code a few days ago - it reverted everything fine, apart from the project itself. When I re-opened the project after revert, all the associated files (source code, resources etc) were not there and I manually had to add them back into the project. Anyone else experienced this?

Jim said...

Robert, I have a feeling the contents of your .xcodeproj file are not being committed. For some reason, I've got to open up that file manually using SCM Results (SCM menu) and commit each file inside.

For those of you who are interested in an easy to set up remote version control, I made a quick write up on it.

Remote Version Control with Subversion and Xcode.

Thanks for your great post, Jeff!

Laurent said...

Hi Jeff, I followed your instructions and for some reason I kept getting

"Error: 180001 (Couldn't open a repository) Description: Unable to open an ra_local session to URL"

I am able to use command line to svn my code into the repo created. But Xcode just isn't able to see it! I did upgrade my svn in /usr/bin to the latest (1.6.1), not sure if that is the cause.

Any idea Jeff on what else I should try? I have burned way too many hours on this already.

Michael said...

sorry late to the party.

I can't even get past this:

svn mkdir file:///Users/Shared/Subversion/HelloWorld/trunk file:///Users/Shared/Subversion/HelloWorld/branch file:///Users/Shared/Subversion/HelloWorld/tag

I get the following error:

svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options
svn: None of the environment variables SVN_EDITOR, VISUAL or EDITOR is set, and no 'editor-cmd' run-time configuration option was found

I've tried setting my Editor to vim but still no cigar. if anyone is still reading this thread and has a suggestion....

Peyo said...

Hi,

Just found this interesting article while browsing for info on how to get started "properly" on the iPhone.

This Subversion set-up seems like a lot of work FOR EVERY NEW PROJECT.

My question: if you're a single developer, what's wrong with just using the Xcode snapshots system ? I can't see what subversion brings on top of it, except many more clicks for doing anything ?

Thanks in advance (and easy on me, I'm an amateur...).

alec vance said...

I also got the editor error when creating directories. I had success using Apple's tutorial for Leopard users here: http://developer.apple.com/mac/articles/server/subversionwithxcode3.html

brandonojc said...

Re: "Not Quite Done Yet" in Xcode version 3 it appears the Project Settings window is slightly re-arranged:

1. Open Project > Edit Project Settings.

2. Click the button in the top right called 'Configure Roots & SCM'.

3. In the dialog window that opens, select your repository from the list and click OK.

Thanks for the great article!

Hector Zarate (@hecktorzr) said...

Wonderful! Thanks!

Ghulam Mustafa said...

Hi Jeff,

Thank you for a wonderful article.

I successfully configured Xcode SCM with subversion locally, but i get stuck when i try to set up the svn repository on a network drive.

I get stuck at the part where i have to create the subversion sub-directories e.g. svn mkdir file://

The error returned by the terminal is: "svn: Can't get exclusive lock on file '/db/write-lock': Operation not supported"

The remote machine is running Mac OS X 10.4 (with no SVN), but that shouldn't matter, right? I'm mounting the network drive.

Any help is greatly appreciated. Thanking in anticipation.

Mustafa

Ghulam Mustafa said...

Here's something that might help people facing problem with the SVN_EDITOR environment variable.

Use following shell commands to set the SVN_EDITOR:

> defaults write ~/.MacOSX/environment SVN_EDITOR "/usr/bin/edit --wait"

Pre-requisite: Install TextWrangler and it's command line tools.

OR

> export SVN_EDITOR=''

Note: If you install TextWrangler, and the first Terminal command doesn't work for you following the following simple steps: 1) On the terminal type "edit /directory_path/file.txt" and see if TextWrangler is used to open the file.txt file. 2.) If it is, use the following terminal command: "> export SVN_EDITOR='edit'". This should do it.

BootBean said...

Jeff, just bought your book, love it so far. Thanks a MILLION for this blog entry on how to use Subversion, I have been worried about what I should use since I started playing around with iPhone development. This makes me feel so much more at ease, use Perforce at work, this seems just as easy :)

nabs said...

Thank you for taking the time to write this. I had adopted the cheap man solution of daily backup's but after an earlier code mistake today (which thankfully I was able to resolve by going to the previous day backup) I realised something -- just get proper source control! The xCode integration of subversion makes this a no-brainer for a single developer like me.

Thanks again dude.

Balaji said...

Jeff.....Amazing Tutorial.....very very helpful and handy....hats Off

Michael Graff said...

Oddly enough, the company I work for is currently going through the merits of git vs mecurial. We are moving from a CVS and Subversion shop to one of those.

Like all things that raise holy war mentality, we are following the rule: pick one and stop discussing it ever again.

That said, I've used git for personal projects, and I agree that it has benefit and for me at least is well worth the added work to set up and use. I miss that it is not integrated into xcode, but I may not miss it as much as wish it were as I've never really liked any IDE integration of any VC to date. Most just get it wrong, or perhaps I expect more.

So, use what you want. Brag about it to your friends, but accept that there is a reason there are so many choices: we're all different.

Edwin said...

scrub m65 kamagra attorney lawyer body scrub field jacket lovegra marijuana attorney injury lawyer

J.J.'s Space said...

It's a great tutorial and I am also a subversion-fan now! Thank you!

maclover93 said...

I have followed your tutorial to the dot, and when I check out the project, all I get is an empty folder. Suggestions?

sharkbird said...

Thank you for this article. Your instructions along with http://nothing2fancy.com/2009/04/27/remote-version-control-with-subversion-and-xcode/ that Jim posted enabled me to access subversion from within Xcode. I have been using svn from the command line prior to today, and am really happy to have this set up.

I really do not understand why people have to be so forceful about justifying why their setup is better than others.

Again, thanks for this tutorial, it has made my work a little bit easier and more pleasant.

Steven said...

Wow - what a frustrating process for a first timer. This looks like a good tutorial, but if you don't know much about the terminal, you can quickly get lost.

When I type: svn mkdir file:///Users/Shared/Subversion/TouchMe/trunk

I get: svn: Could not use external editor to fetch log message; consider setting the $SVN_EDITOR environment variable or using the --message (-m) or --file (-F) options

Jeff remarks that vi is probably the default editor, but apparently that's not the case.

I don't know what a bash file is or if I'm even a "bash user" or not. Lots of searching on google just gets suggestions that end up with new errors.

Sorry if I sound irritated - I've been at this for hours and still not making any progress.

Steven said...

Never mind - I decided to forge ahead and skipped the command line stuff. You can create the trunk, tag and branch directories from Xcode in the repositories window.

BootBean said...

Steven, as lunatic said above, set your default editor to VI (I'll get you through it)...
1) In the same terminal window, type:
export SVN_EDITOR=vi
2) Re-issue the command:
svn mkdir file:// ...
3) When the editor pops up (it should automatically), press that's the shift key, then Z, then Z. This should save the file for you and exit the editor. You can then proceed to Jeff's next steps.

Hope this helps! And I hope I got that all correct, doing it from memory.

Mark V said...

Thank you!

h4ns said...

What youre saying is completely true. I know that everybody must say the same thing, but I just think that you put it in a way that everyone can understand. I also love the images you put in here. They fit so well with what youre trying to say. Im sure youll reach so many people with what youve got to say.

Arsenal vs Huddersfield Town live streaming
Arsenal vs Huddersfield Town live streaming
Wolverhampton Wanderers vs Stoke City Live Streaming
Wolverhampton Wanderers vs Stoke City Live Streaming
Notts County vs Manchester City Live Streaming
Notts County vs Manchester City Live Streaming
Bologna vs AS Roma Live Streaming
Bologna vs AS Roma Live Streaming
Juventus vs Udinese Live Streaming
Juventus vs Udinese Live Streaming
Napoli vs Sampdoria Live Streaming
Napoli vs Sampdoria Live Streaming
Fulham vs Tottenham Hotspur Live Streaming
Fulham vs Tottenham Hotspur Live Streaming
AS Monaco vs Marseille Live Streaming
AS Monaco vs Marseille Live Streaming
Alajuelense vs Perez Zeledon Live Streaming
Alajuelense vs Perez Zeledon Live Streaming
Technology News | News Today | Live Streaming TV Channels

healthpharmacyrx1 said...

clomid Rezeptfrei Kaufen
flagyl Bestellen Rezeptfrei
cialis achat france
levitra Online Bestellen
kamagra Ohne Rezept Kaufen
cialis soft Online Rezept
priligy Bestellen Online
acheter lovegra pas cher
achat xenical france
achat viagra france
lovegra achat
diflucan Rezeptfrei Kaufen
kamagra Bestellen Rezeptfrei
lasix Ohne Rezept Kaufen

Jann said...

Please also explain how to use a SVN with XCode 4. I am able to connect but not able to update the code in SVN.