Xcode에서 Git을 올바르게 사용하는 방법은 무엇입니까? 할 때 동료 개발자가

나는 한동안 아이폰 개발자였으며 ​​최근에는 내 워크 플로우에 git을 포함 시켰습니다. 지금까지 내 워크 플로 에 http://shanesbrain.net/2008/7/9/using-xcode-with-git 에있는 git 설정을 사용했습니다 .

이러한 설정은 git에게 병합에서 * .pbxproj를 제외하도록 지시합니까? 이렇게하는 진짜 이유가 있습니까? 예를 들어, 프로젝트에 파일을 추가하고 원본으로 푸시 할 때 동료 개발자가 끌어 올 때 xcode 프로젝트에 해당 파일을 추가하지 않습니다. 그런 다음 그들 중 하나가 릴리스를 빌드하면이 파일이 포함되지 않을 수 있습니다. git이 프로젝트 파일의 병합을 처리하도록해야하지 않습니까? 이 파일이 병합되어야하는 이유 또는 이유는 무엇이며 파일이 프로젝트에 추가 될 때 상황을 올바르게 처리하는 방법은 무엇입니까?



답변

저는 SDK 출시 이후로 iPhone 애플리케이션을 풀 타임으로 작업 해 왔으며 대부분의 시간은 여러 개발자가있는 팀에서 작업했습니다.

사실은 .pbxproj 파일의 병합을 허용하지 않는 것이 도움이되는 것보다 더 해롭다는 것입니다. 당신이 말했듯이, 다른 사람들이 그 파일을 얻지 않는 한 파일을 추가 할 때, 그들은 또한 그들의 프로젝트에 추가해야합니다. 어떤 크기의 응용 프로그램에서든 짜증이 나고 소스 코드 제어의 큰 이점을 빼앗 깁니다. 실제로 git을 통해서는 완전한 이전 프로젝트 상태로 되돌릴 수 없습니다.

.pbxproj 파일은 XML과 유사한 속성 목록입니다. 경험상, 두 사람이 동시에 파일을 추가 한 경우에만 발생했던 병합 충돌이 발생했습니다. 병합 충돌 사례의 99 %에 대한 해결책은 병합의 양쪽을 유지하는 것입니다. git의 경우 최소한 >>>>, <<<< 및 ==== 행을 제거하는 것이 포함됩니다. 사실 이것은 매우 일반적이어서 git의 병합 상태에서 .pbxproj 파일을 수정하는 간단한 셸 스크립트를 만들었으므로 프로젝트 디렉터리 (Classes 수준에서) 내에서 실행합니다.

#!/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

실패하는 최악의 경우 (XCode에 프로젝트로드를 요청했지만로드에 실패 함) .pbxproj 파일을 삭제하고 git에서 마스터를 확인한 다음 파일을 다시 추가하면됩니다. 하지만이 스크립트를 사용하여 여러 달 동안 이런 일이 발생하지 않았으며, 다른 여러 개발자와 함께 iPhone 응용 프로그램에서 풀 타임으로 작업했습니다.

스크립트 대신 사용할 수있는 또 다른 옵션 (아래 주석에서 지적)은이 줄을 .gitattributes 파일에 추가하는 것입니다.

*.pbxproj text -crlf -diff -merge=union

그런 다음 git은 .pbxproject 파일에 대한 병합의 양면을 항상 취하여 추가 작업없이 만 제공 한 스크립트와 동일한 효과를 갖습니다.

마지막으로 내 완전한 .gitignore 파일은 원하지 않는 몇 가지 사항이 있으므로 무시하도록 설정 한 내용을 보여줍니다. 제 경우에는 실제로 emacs 잔재와 전체 빌드 디렉토리 만 있습니다.

# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile

답변

이것은 Xcode 4.6 및 Git 1.7.5에서 저에게 효과적입니다.

다음과 같이 .gitattributes 파일을 추가하고 커밋합니다.

*.pbxproj binary merge=union

나는 이것을 다른 팀원과 함께 테스트했으며 훌륭하게 작동합니다.

출처 :
http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap


답변

솔직히 기존 답변은 오해의 소지가 있습니다.

파일을 삭제하거나 이름을 바꾸지 않는 경우 merge=union다른 커밋의 차이점을 직접 결합하는 전략 을 사용 하는 것이 좋습니다.

그러나 현실에서는 때때로 파일을 삭제하거나 이름을 변경해야합니다. 수정하지 않고 차이점을 병합하면 이러한 상황에서 많은 문제가 발생 하며 이러한 문제는 일반적으로 “작업 공간 무결성-프로젝트를로드 할 수 없음”문제로 이어지며 프로젝트를 실행할 수도 없습니다.

지금까지 얻은 최고의 솔루션 :

1) 프로젝트를 잘 설계하고 처음에 필요한 모든 파일을 추가하므로 project.pbxproj.

2) 기능을 작게 만드십시오. 한 지점에서 너무 많은 일을하지 마십시오.

3) 어떤 이유로 든 파일 구조를 수정하고에서 충돌이 발생 project.pbxproj하면 자주 사용하는 텍스트 편집기를 사용하여 수동으로 해결하십시오. 작업을 작게 만들면 충돌을 쉽게 해결할 수 있습니다.


답변

짧은 대답은에 해당 줄을 포함하지 않더라도 .gitattributes.pbxproj의 두 수정 된 버전을 쉽게 병합하지 못할 수 있다는 것입니다. git이 바이너리로 처리하는 것이 좋습니다.

자세한 내용은 여기를 참조하십시오 : Git 및 pbxproj

업데이트 : git book이 여전히이 답변에 동의 하더라도 더 이상 동의 하지 않습니다. .pbxproj다른 비 바이너리 소스 파일과 마찬가지로 버전을 제어 합니다.


답변

XCode 프로젝트 파일에서 병합 충돌을 처리 할 수있는 Python 스크립트를 만들었습니다.

시도하고 싶다면 여기에서 확인할 수 있습니다 : https://github.com/simonwagner/mergepbx

병합 드라이버로 설치해야하므로 프로젝트 파일에 병합 충돌이있을 때 자동으로 호출됩니다 (README.md가이를 수행하는 방법을 알려줍니다).

프로젝트 파일의 의미 merge=unionmergepbx이해하므로 사용 하는 것보다 훨씬 잘 작동 하므로 충돌이 올바르게 해결됩니다.

그러나 프로젝트는 여전히 알파이므로 외부에있는 모든 프로젝트 파일을 이해할 것으로 기대하지 마십시오.