Xcode에서 Git을 올바르게 사용하는 방법은 무엇입니까?


94

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

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


9
XCode로 작업하지 않지만 * .pbxproj 파일이 Visual Studio의 * .csproj 파일 (일부 파일 목록)과 같은 경우이 설정은 나에게 다소 어리석은 것처럼 보입니다. 사람이 두 사람이 프로젝트에 파일을 추가 할 때 병합 충돌의 피곤하고 최선의 해결책은 나사의 모든 것을 최대 ...이었다 생각했던 것 같은데
R. 마르틴 페르난데스

XCode의 문제 (Visual Studio에 대해 확실하지 않음)는 .pbxproj 파일이 거의 사람이 읽을 수 없기 때문에 충돌을 직접 해결하는 것은 의미가 없다는 것입니다.
Tom

7
* .pbxproj 파일은 실제로 매우 잘 구조화되어 있으므로 블록 끝과 시작 세그먼트 사이에 길게 늘어납니다. 절약의 은혜는 파일에 줄 바꿈이 잘 배치되어 있으므로 줄을 수정하고 자동 병합이 일반적으로 잘 작동하므로 엉망으로 만들기가 어렵다는 것입니다. 또한 병합 블록이 일반적으로 이해하기 쉽다는 것을 의미합니다. 한쪽에는 몇 개의 파일 집합이 추가되고 다른쪽에는 다른 파일 집합이 추가되어 있습니다.
Kendall Helmstetter Gelner 2010

답변:


136

저는 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

3
xcode 프로젝트에 .gitattributes 파일을 사용합니까? 그리고 당신의 통찰력에 감사드립니다. 앞으로 pbxproj 파일을 병합하는 것이 훨씬 쉬울 것이라고 생각합니다.
rickharrison 2010

1
지금까지 우리는 그것의 일부 측면이 흥미로워 보이지만, 내가 함께 일한 사람들은 고급 git 사용자가 아니기 때문에 고급 기능에 대한 옹호가 강하지 않습니다.
Kendall Helmstetter Gelner 2010

1
".pbxproj 파일은 단순히 JSON (XML과 유사)입니다." 실제로 OpenStep 형식의 속성 목록입니다. JSON과 동일한 기본 아이디어이지만 구문이 몇 군데에서 다릅니다.
Peter Hosey

1
시도 할 또 다른 방법
-set

1
스크립트를 실행하는 대신 @KendallHelmstetterGelner에 동의합니다. 스크립트를 실행하면 이러한 특수 줄이 제거 됩니다. union스위치를 사용하여 .gitattribute를 업데이트 할 수 있습니다.. *.pbxproj text/plain -crlf -diff -merge union
Besi 2012-07-16


8

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

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

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

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

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

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

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


3

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

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

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


파일을 통해 파일을 보내 simplejson거나 인덱스로가는 도중에 더 깔끔한 커밋 필터를 설정할 수있는 것처럼 들립니다 . 그래도 작동이 보장되지는 않습니다.
intuited

1
JSON 형식의 파일이 아닙니다. 비슷해 보이지만 세부적으로 많은 차이가 있습니다.
eonil

git book에 JSON이 나와 있지만 잘못된 것 같습니다. git-scm.com/book/ch7-2.html
huggie

1
확인. .pbxproj파일은 실제로 오래된 스타일의 NeXT / Cocoa PList 파일로, JSON보다 훨씬 이전에 정의되었으며 이제 Apple에서 더 이상 사용하지 않습니다. (그러나 그들은 여전히 ​​일부 장소에서 그것을 사용하고 있습니다) 책의 파일에 대한 언급은 완전히 잘못되었습니다. 당신이 명시 적으로 언급했기 때문에 나는 반대표를 제거했습니다.
eonil

2

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

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

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.