Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
634 views
in Technique[技术] by (71.8m points)

git - In Xcode 4 how do I add a remote GitHub repository to an existing local project?

The Git integration in Xcode 4 is very welcome however it seems to be a bit flaky when it comes to dealing with remote repositories. For clarity I'm using OS X version 10.6.7 and Xcode 4.0.2 (4A2002a).

If I create a new Xcode 4 Project and accept the option to create a local Git repository, all is well. I can commit locally and that's great.

When I want to push the new project to GitHub I want to add a remote repository and push my local changes up to GitHub. I can add a GitHub repository to Xcode 4 as a new Repository in the Organizer window but there's no method of setting it as a remote repository for my existing project.

So I switch to using git commands in Terminal.

git remote add origin https://<username>@github.com/<organization>/<repository>.git

If I then go back to Xcode 4 and try to use

File -> Source Control -> Push...

then the Choose the repository to which to push changes. dialog appears listing the origin remote repository. There's a yellow indicator saying that Authentication is required, which is fine as I've not been able to enter my credentials yet for HTTPS. However when I click 'Push' and it tries to push the changes it says "The operation could not be performed because access to the repository 'origin' is denied."

A dialog prompting me for my username and password then appears with my pre-filled out so it must be reading this correctly from the local repository's config.

When I enter my password Xcode 4 then crashes with the following error

ASSERTION FAILURE in /SourceCache/IDEKit/IDEKit-303/Framework/Classes/SourceControl/IDESourceControlOperationInfo.m:59
Details:  Message sent to invalidated object: <IDESourceControlPushOperationInfo, 0x200bd2a80>. Backtrace for invalidation:
 (null)
Object:   <IDESourceControlPushOperationInfo: 0x200bd2a80>
Method:   -invalidate
Thread:   <NSThread: 0x200020700>{name = (null), num = 1}
Hints:   None

If I restart Xcode an origin repository has been added to the Repositories browser in Organizer and I can see the master branch on GitHub so I know the credentials are right without me changing anything.

Has anyone found a reliable way of using Xcode 4 with GitHub starting with a local project first?

If I clone an existing GitHub repository with an Xcode project in it, open it with Xcode 4 then even though the first Push seems to fail, the 2nd push did then work. So maybe starting from absolute scratch with Xcode 4 creating the repository for me isn't the best pattern (until they improve the Git tooling in a later version of Xcode 4).

EDIT WITH FURTHER DETAILS OF ONE WORKAROUND

This example only really applies to the first project you're adding to a GitHub repository. As such I think you're better off with the following steps, bearing in mind there still seem to be some Xcode 'gotchas' in this solution.

  1. List item
  2. 'Connect to a repository' from Welcome to Xcode dialog.
  3. Use GitHub SSH URL for Location
  4. Give it a name (RepositoryName)and Clone to a directory
  5. 1st attempt appears to fail even though contents are downloaded
  6. Try Again and it works.
  7. There is now a new Repository defined in the Organizer window with its origin set to the GitHub remote SSH URL.
  8. Create a New Project within the directory you just cloned into but DO NOT tick the 'Create local git repository for this project' option.
  9. Do initial commit to local Git repository.
  10. Try Source Control -> Push and Xcode 4 fails with 'The operation could not be performed because access to the repository RepositoryName was denied. Check username and password'
  11. Try Source Control -> Push and Xcode 4 pops up the remote Repository dialog again but this time has detected a remote Repository called origin. Next to it there's a yellow ball and 'Authentication required'.
  12. Clicking 'Push' again caused the remote Push to work.

One thing I've spotted and not managed to work out yet is that the response messages back from GitHub with the checkin hash value and any messages seem to get reported in Xcode Log navigator as Push failures, even though the Push is successful as far as GitHub is concerned.

Anyone else have a better solution?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

I think I found the Xcode way to push a existing project to GitHub or any other remote repository!

Preconditions

  • I assume that you have a project created by Xcode 4 with a local git repository.
  • You created an empty remote git repository (I call it RemoteRepository in in the following example)

Push it to remote

  1. Open the Organizer in Xcode an go to the Repositories tab

  2. At first click on Remotes and then on "Add Remote"

    Xcode Organizer

  3. Enter a Remote Name and the Location of your remote repository and click on create

    Add a remote dialog

  4. Then select your project and open File -> Source Control -> Push ...

    open push dialog

  5. Select your remote repository and wait until it is connectable! Look for the Create in the brackets.

    push dialog

  6. Now your old project is published to GitHub

    result on GitHub

I hope it will works for you also! In my case it works with every remote git repository.

Please contact me on twitter if something unclear or wrote in bad English!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...