Xcode 7.3 Source control issue for files - ios

I've pushed code on local server manually. Thereafter taken checkout of project using CornerStone.
However, the project contains few file with different versioning states i.e A, M and A+.
But project in CornerStone dosen't shows any of these versioning states.
I tried to fix it by committing files (showed commit success) but it remained same.
I'm worried since this will create confusion at later stage.
How to fix this?

Related

Xcode : Some image assets appear Unassigned after git clone

As usual I've commited my Xcode project with Xcode Source Control interface. Then, when I clone the project, for a unknown reason, some images from the Assets.xcassets folder appear with a warning showing Unassigned. See attached screenshot :
If I drag the Unassigned image to 1x, the warning disappear. But I have to do this with each concerned image, and each time I clone the project.
What is weird is that the image get correctly commited (as I can reassign it), but the asset seems messed up.
Does anyone has an idea of what can be the root cause of this ? Using Xcode 9.3.
I had a same issues whenever after git pull or clone.
I assume it is a Xcode bug vulnerable reading special characters other than Enligh characters.
Mine fixed after changing image filename to english characters only without any special characters(other than English characters) included.
Try fixing your asset file name to something else using just english characters.
I see your assets filename contains some special characters.
I'm using the source control integration in Xcode since version 6 and today in Xcode 9.3 is more easy to use if you have nice configured, for example in my project there are three programmers and one use sourceTree, other use the command line and me xcode to send commits everyday and resolve conflicts with the files or merges, your issue is not related with the GUI or git operations.
You need to delete these files Unassigned, just click and press the button delete in your keyboard and remove all references so you can do clean and add again the file reference and assign, after you can do build and make a new commit using xcode and send the changes.

I want to restore my project in my yesterday file in Xcode, how can i do that?

I am a beginner in the iOS development, Now i am trying to debug my code
As we know, Xcode is autosaving. I am debugging a chunk of code right now, But i am messed up, somehow it didn't work properly, I have tried using control + Z to get back, but it still didn't work.
I want to back to my yesterday Xcode project file, but the problem is, i have not made any backup, and i have not made local repository. Can get my previous version file back?
does it work if i use git reset ?
git reset
You should use Github for saving your project by committing daily updates
OR
You can recover some of files using TextEdit
By using TextEdit App you can view and restore past versions of documents.
Step 1:
Open your document file using TextEdit.
Step 2:
TextEdit ->File->Revert To->Browse All Version
Stpe: 3:
Select files from old dates whichever you want & click restore.
Apple Guide
I'm afraid there no way to go back. No repo, no CRT+Zm no copies? I dont see any option.
PD: Create a local repot
'git reset' will not work for you. You should have setup a Git repository with timely commits. Create a git repo now so that you will not face the same situation later.

Xcode repository indicators meanings

I wonder what these shortcuts mean and since I already can figure out that "shortcut" is not the right word for it, I don't even know what to google so I'll just strike a question here.
Here's the screenshot:
So, what does M, A, ? and all other shortcuts mean exactly ?
From this SO question:
U: Working file was updated
G: Changes on the repo were automatically merged into the working copy
M: Working copy is modified
C: This file conflicts with the version in the repo
?: This file is not under version control
!: This file is under version control but is missing or incomplete
A: This file will be added to version control (after commit)
A+: This file will be moved (after commit)
D: This file will be deleted (after commit)
S: This signifies that the file or directory has been switched from the path of the rest of the working copy (using svn switch) to a branch
I: Ignored
X: External definition
~: Type changed
R: Item has been replaced in your working copy. This means the file was scheduled for deletion, and then a new file with the same name was scheduled for addition in its place.
L : Item is locked
E: Item existed, as it would have been created, by an svn update.
Note that these are SVN status codes and some of them do NOT apply to XCode as #Zaph pointed in comments. Anyway I think most used are included in this link and are valid in xCode too.
Maybe you ended up here because you merged two branches together in Xcode and got a bunch of exclamation marks (!) as a result and wonder what they mean, what the actual problem is, and how you get rid of them? If so, do the following:
Navigate to your projects folder and open it in Terminal (easiest by dragging the folder to the Terminal app icon).
Type git push.
Restart Xcode.
(You may get a warning in 2 if you have uncommitted changes, in that's case just type git commit -m "Your commit comment" and then type git push again.)
The problem here is just a miscommunication between Xcode and the Git repository, and Xcode probably can't work out whether the marked files have been pushed or not.
Generally, my experience is that for all inexplicable problems with the source control in Xcode (missing files, not under source control warnings etc) it's best to handle them directly in the project folder with Terminal. Start by typing git status and you'll (mostly) get a quite clear explanation of what's the problem and how to solve it.
Good luck!
These are code version repository indicators.
M - modified file.
A - added file.
? - untracked file.
There are Xcode Source Control management codes, they provide the file status as below:
' ' (Blank) Unmodified
'M' Locally modified
'U' Updated in repository
'A' Locally added
'D' Locally deleted
'I' Ignored
'R' Replaced in the repository
'-' The contents of the folder have mixed status; display the contents to see individual status
'?' Not under source control
Status codes From section Store and Track Changes with Source Control of Apple's Xcode documantation.
It's the modification status of the file : M is for Modified and A is for Added

xcode duplicates files in project

I'm at a complete loss as to what I did to cause this:
For the second time since I started using XCode about a month ago (my first time seriously using it after taking one class several years ago) I try to run my project and the next thing I know I have errors because I have duplicate references. I looked at the project and it appeared that most of the files in my project had duplicated themselves, however I discovered that they are not duplicate files just duplicate references. This happened to me today when I tried to build on an actual iphone for the first time but it also happened to me a few weeks ago while using the simulator. Neither time do I recall doing anything unusual. I have built and tested the project probably 100+ times and normally all goes ok. I was able to fix it the first time but I think I have made it worse this time and am probably going to add the files back into a new project. My co-worker also mentioned this happening to him (he has about as much experience with xcode as I do). He told me he ended up with files nested in folders (groups?) nested in other folders about 20 deep.
My question is this: Does anyone know what I may have done to cause this. I would really like to avoid this problem in the future since it is proving to be quite a headache. Any advice would be greatly appreciated.
E.T.A. xcode version 4.6.2 (possibly an earlier version the first time it happened)
Try this instead:
Highlight all the duplicate files
Right click on one of the files and press "Delete"
When prompted for which delete option, click "Remove Reference"
Also you asked for "any advice".
If you aren't already using git source control in your Xcode projects, start now.
You can spot many mistakes like this earlier and fix them more easily using git.
When you add files as a copy, the Xcode project navigator shows added files with an A and modified files with an M.
If the file is inside a closed group folder, the folder shows an A.
If you add a reference without a copy the project navigator won't show an A but MyApp.xcodeproj will show M.
In Xcode you can discard a change before committing it.
In the case below, you would discard changes to all added or modified files.
Typically you review and commit changes frequently.
Using a gui tool such as SourceTree, you have a good chance of spotting an accidental change before you commit. For example, you can see changes to the project file.
If you accidentally commit an unintended change, you can go back later and reverse a commit.
By committing frequently, you have more control over which changes you undo and which ones you keep.
References:
http://www.raywenderlich.com/13771/how-to-use-git-source-control-with-xcode-in-ios-6
http://git-scm.com/doc (scroll down to see videos)
http://www.sourcetreeapp.com
http://gitimmersion.com
I had the same 20 deep nesting of my main folder of images. If its not a bug its very strange behaviour. I just backed it all up !! Then I opened the folder in finder, found the point at which it was starting to nest and deleted it.
I did a rebuild, but I don't think Xcode even noticed. It made no difference to the size of my app so Xcode was not putting unnecessary files in the binary.
This happened to me when I imported a file. Suddenly I had two nested directories containing what looked like copies of all my files. The compiler complained about duplicate classes.
I found a solution, but it's a ball-ache and a time sink.
1: Click on your project in the navigator to open up the project settings in the main view.
2: Open the 'Compile Sources' accordion entry.
(This allows you to see which files are being used in the compilation process.)
3: Find any duplicates in here and delete them.
(At this stage your project should compile again.)
4: In your navigator view, slow-double-click one of the files that's duplicated there. This should allow you to rename it. Change the name (not the extension) slightly.
5: You should notice that the copy becomes red. Select it and hit delete.
(This avoids the delete operation removing the file from the 'Compile Sources')
6: Rename the original file back to its original name again.
7: Repeat from 4 until done, or until bored.
8: Explain to your boss why a simple copy change took half a day.
This process can be optimised up by first renaming all duplicated files, then deleting the duplicates all at once. However this means that you can't test for successful compilation between steps, which allows you to narrow the culprit down to a single file. And takes even more time.
If compilation fails, ensure all the files you need are still in the 'Compile Sources' section, as this process can cause them to be lost from there. The compiler will normally give some reasonable errors about missing classes and variables, but a missing AppDelegate will produce a more confusing error.

How to use Git properly with Xcode?

I have been an iphone developer for a while, and I have recently been including git in my workflow. I have used git settings found on http://shanesbrain.net/2008/7/9/using-xcode-with-git for my workflow so far.
Those settings tell git to exclude *.pbxproj from merges? Is there a real reason for doing this? For example, when I add a file to the project and push to origin, my fellow developers will not have that file added to their xcode project when they pull. Then if one of them builds a release this file may not be included. Shouldn't I just let git handle the merges for the project file? Why or why not this file should be in merges and how to properly handle the situation when files are added to the project?
I have worked on iPhone applications full time since the SDK launch, most of that time spent working on teams with multiple developers.
The truth is that it's way more harmful to disallow merging of that .pbxproj file than it is helpful. As you say, when you add a file unless other people get that file, they have to also add it to their project - in an application of any size, that sucks and it also takes away a huge benefit of source code control in that you cannot really revert to a complete earlier project state just through git.
The .pbxproj file is simply a property list (similar to XML). From experience, just about the ONLY merge conflict you were ever get is if two people have added files at the same time. The solution in 99% of the merge conflict cases is to keep both sides of the merge, which for git at least simply involves removing any >>>>, <<<<, and ==== lines. In fact this is so common that I have created a simple shell script to fix a .pbxproj file in a merge state from git, I run this from within the project directory (at the Classes level):
#!/bin/sh
projectfile=`find -d . -name 'project.pbxproj'`
projectdir=`echo *.xcodeproj`
projectfile="${projectdir}/project.pbxproj"
tempfile="${projectdir}/project.pbxproj.out"
savefile="${projectdir}/project.pbxproj.mergesave"
cat $projectfile | grep -v "<<<<<<< HEAD" | grep -v "=======" | grep -v "^>>>>>>> " > $tempfile
cp $projectfile $savefile
mv $tempfile $projectfile
Worst case if it fails (you ask XCode to load the project and it fails to load), you simply delete the .pbxproj file, check out the master from git, and re-add your files. But I've never had that happen in many months of use with this script, again working full time on iPhone applications with several other developers.
Another option (pointed out in comments below) that you can try using in place of the script, is to add this line to a .gitattributes file:
*.pbxproj text -crlf -diff -merge=union
Then git will always take both sides of a merge for the .pbxproject files, having the same effect as the script I provided only without any extra work.
Lastly, here is my complete .gitignore file, showing what I do have it set to ignore as there are a few things you don't want - in my case really just emacs remnants and the whole build directory:
# xcode noise
build/*
*.pbxuser
*.mode1v3
*~
# old skool
.svn
# osx noise
.DS_Store
profile
This works for me in Xcode 4.6 and Git 1.7.5.
Add and commit .gitattributes file with this:
*.pbxproj binary merge=union
I've tested this with another team member and works great.
Taken from:
http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap
Frankly, the existing answers are misleading.
If you never delete or rename files, then using the merge=union strategy, which just combines the differences in different commits directly, is a good idea.
However, in the real world, we do need to delete or rename files sometimes. Merging the differences without any modification would make a lot of problems under these situations, and these problems usually lead to the "Workspace Integrity - Couldn't load project" issue, which makes you even not able to run the project.
The best solution I got so far:
1) Design the project well and add all the needed files at the beginning, so you would seldom need to change the project.pbxproj.
2) Make your features tiny. Don't do too many things in a branch.
3) For any reason, if you need to modify the file structure and get conflicts in project.pbxproj, use your favorite text editor to solve them manually. As you make your tasks tiny, the conflicts might be easy to solve.
The short answer is that even if you don't include that line in .gitattributes, you may not be able to easily merge two modified versions of a .pbxproj. It's better for git to treat it as a binary.
See here for details: Git and pbxproj
Update: Even though the git book still agrees with this answer, I no longer do. I version control my .pbxproj just like any other non-binary source file.
I did create a Python script that can handle merge conflicts in XCode Project files.
If you want to try it, you can check it out here: https://github.com/simonwagner/mergepbx
You will have to install it as a merge driver, so it gets called automatically when you have a merge conflict in your project file (the README.md will tell you how to do that).
It should work much better than using merge=union as mergepbx understands the semantics of your project file and therefore will resolve the conflict correctly.
However the project is still alpha, don't expect it to understand every project file that is out there.

Resources