sourcecode

Xcode에서 충돌(file project.pbxproj)을 병합하는 방법은 svn을 사용합니까?

codebag 2023. 10. 15. 17:17
반응형

Xcode에서 충돌(file project.pbxproj)을 병합하는 방법은 svn을 사용합니까?

우리 팀에는 두 명의 멤버가 있습니다.우리는 소스코드 파일을 관리하기 위해 Xcode의 SCM (usse SVN)을 사용합니다.
우리는 모두 Xcode 프로젝트에 파일을 추가합니다.그는 SVN 서버에 헌신했습니다.하면 Xcode다에 것을 project.pbxproj합니다 합니다. 그러면 종료를 선택합니다.Xcode충돌을 수동으로 병합합니다.합니다를 합니다.project.pbxproj, 우리의 변화를 통합합니다.하는 방법을 잘 다하는 할 뿐입니다. 제가 사용하는 텍스트를 추가할 뿐입니다.project.pbxproj파일이 없었습니다.제가 끝내면 프로젝트가 열리지 않습니다.엔 그 project.pbxproj수동으로 파일을 편집할 수 없습니다.

그래서 이 문제를 발견했을 때 project.pbxproj 파일에 충돌이 있는데 어떻게 해결해야 하는지 알고 싶습니다.

감사해요!

git를 사용하지만 같은 문제가 보입니다. 두 사람이 파일을 추가하면 병합 충돌이 발생합니다.

보통 편집은 아주 쉽지만요.텍스트 편집기를 사용하여 project.pbxproj 파일에 들어가서 병합 충돌 섹션을 찾습니다. 보통 다음과 같이 표시됩니다.

>>>>>>>
Stuff 1
======
Stuff 2
<<<<<<<<

Xcode 프로젝트 병합 충돌 사례의 99%에서 두 사람이 서로 다른 파일을 추가했기 때문에 병합의 양쪽을 모두 수락하기를 원할 뿐입니다. 따라서 위의 경우에는 병합 마커를 삭제하기만 하면 됩니다.

Stuff 1
Stuff 2

말씀드린 것처럼 대부분의 경우에 효과가 좋습니다.작업이 끝났을 때 Xcode가 프로젝트 파일을 읽지 않을 경우 가장 최근의 병합되지 않은 버전을 가져다가 수동으로 파일을 다시 추가하면 됩니다.

Follow up

이 조언은 여전히 유효하지만, 최근에는 복잡한 Xcode 프로젝트 파일을 가진 매우 크고 오래된 애플리케이션을 작업하고 있고, 여러 팀원들이 종종 큰 추가 작업을 하고 있습니다.

병합 충돌을 수동으로 검사하는 것이 여전히 주요한 방법입니다.여러 사람이 새 파일을 추가하는 것은 병합 충돌의 양쪽을 모두 사용하는 것만큼 쉬운 경우가 많습니다.

분기에 병합하려는 프로젝트 파일을 단순히 가져오는 것과 충돌이 있는 Xcode 프로젝트의 복사본을 사용하여 변경 사항을 수동으로 다시 추가할 수 있다는 단점도 있습니다.

특히 제가 발견한 몇 가지 경우는 매우 명확하지 않은 해결책을 가지고 있는 시나리오에 대해 어려움을 제기할 수 있습니다.

첫 번째는 이름이 같은 파일에서 여러 사람이 작업할 경우 다른 식별자를 가진 파일 전체가 여러 개 발생할 수 있다는 점입니다.이 문제의 경우 파일이 포함될 그룹 내의 파일 ID를 찾아 보존할 파일 ID와 폐기할 파일 ID를 선택합니다.

두 번째는 프로젝트에서 유사한 위치에 새 그룹을 도입하면 그룹을 분할하는 충돌이 발생할 수 있습니다.이 경우 병합의 한쪽 내용을 병합 충돌 영역에서 완전히 벗어나 프로젝트 파일의 다른 그룹과 함께 올바르게 소개해야 할 수도 있습니다.

마지막은 제가 이 답변을 업데이트하도록 유도한 명백하지 않은 해결책입니다.즉, 모든 CoreData 버전의 항목이 완전히 다른 식별자를 가지는 충돌이 발생할 수 있습니다.예를 들어 두 팀이 동시에 모델 버전을 업그레이드한 경우에 이 문제가 발생할 수 있습니다.

그런 경우에는 해당 식별자만 사용하여 한 쪽 또는 다른 쪽을 취할 수 있습니다.이것은 때때로 효과가 있습니다.

그러나 프로젝트를 로드할 때 모델 버전이 아예 나타나지 않는 경우도 있습니다. Xcode는 이를 모두 삭제했습니다.

솔루션은 다시 병합의 양쪽에 남겨두는 것이었습니다. 즉, 핵심 데이터 모델에 대한 두 개의 항목을 의미했습니다.이렇게 하면 프로젝트를 로드할 때 Xcode가 발생합니다. 두 모델 모두에 대해 유효한 식별자를 선택하고 하나의 올바른 버전을 저장합니다.

CoreData를 사용하는 대규모 팀의 경우, CoreData 모델이 변경된 상태에서 별도의 분기점을 설치하는 것이 작업을 원활하게 진행하는 데 도움이 되었습니다.그렇게 되면 모든 팀이 동일한 현재 모델 식별자와 내부 Xcode 프로젝트 ID를 가진 동일한 CoreData 버전을 최대한 빨리 사용하게 됩니다.이 지사는 CoreData 모델 자체만 보유하고 모델과 관련된 클래스는 보유하지 않았습니다(가능하지만).

안타깝게도 한 번의 체크아웃에서 수동으로 변경한 후 새로 "합병"된 프로젝트를 체크인하는 것 외에는 할 수 있는 일이 많지 않습니다.

이 해결책은 단지 목적을 위한 것이지만, 당신은 추가할 수 있습니다..gitattributes프로젝트에 파일을 보낸 다음 해당 파일 내에 다음 줄을 추가합니다.

*.pbxproj merge=union

이것은 합병의 양측을 유지하는 것을 알려줄 것이고, 이것은 대부분의 시간에 당신이 원하는 것이 될 것입니다.

을(를)합니다.UUID각각의 충돌하는 항목에 대해.

예:

<<<<<<< HEAD
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
=======
    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };
>>>>>>> branch_to_merge

각 UUID 확인:

  • 합니다 ExistingFile.swift
  • 를) 유지합니다.NewFileA.swift그리고.NewFileB.swift
  • 즉 에서 할 수 있습니다.project.pbxproj파일, 나는 그것이 인공적이고 삭제해도 안전하다고 생각합니다.

결과는 다음과 같습니다.

    6B01C4B72008E70000A19171 /* ExistingFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6B01C4B62008E70000A19171 /* ExistingFile.swift */; };
    3F01C4B72008E70000889299 /* NewFileA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F01C4B72008E70000889299 /* NewFileA.swift */; };
    4DF01C4B72008E70000882ED /* NewFileB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4DF01C4B72008E70000882ED /* NewFileB.swift */; };

참고: 추가할 것을 권장하지 않습니다.*.pbxproj merge=union.gitattribues기본적으로 병합 충돌을 무시하기 위한 파일입니다. 충돌하는 병합은 정교한 스크립트가 없는 한 항상 수동으로 확인해야 하기 때문입니다.

이 문제에 대한 간단한 해결책을 찾고 있던 중에 또 다른 질문/답변을 접하게 되었습니다.

https://stackoverflow.com/a/14180388/307217

저는 이 솔루션이 얼마나 간단한지에 완전히 충격을 받았습니다. 트렁크 뒤에 거의 200개의 수정판이 있는 서로 다른 기능 지점에서 합병을 시도하고 있었습니다. XCode와 Mercurial은 이에 대해 만족하지 못하고 있었습니다.저는 이 솔루션을 시도하기 전에 pbxproj 파일(100번 이상 충돌)을 수동으로 병합하려고 8번 시도했습니다.

기본적으로 해결책은 다음과 같습니다(Mercurial을 사용한다고 가정할 때, 이는 훌륭하기 때문입니다).

  1. 머큐리얼로 병합을 시도합니다.

    hg update FEATURE_BRANCH
    hg merge default
    *mercurial gives you a ton of crap about the pbxproj file having merge conflicts*
    
  2. 오픈엑스코드

  3. 상단 도구 모음에서 Xcode->개발자 도구 열기->파일 병합을 선택합니다.
  4. 왼쪽에서 충돌한 'project.pbxproj' 파일(병합 충돌 마크업이 있는 파일)을 엽니다.
  5. 오른쪽에서 'project.pbxproj.orig'를 엽니다.
  6. 파일->Save Merge를 선택하고 'project.pbxproj' 파일 위에 저장합니다.
  7. 그런 다음 명령 줄로 돌아옵니다.

    hg resolve -m ProjectName.xcodeproj/project.pbxproj
    *merge any other broken files*
    hg commit -m "manually merged with trunk"
    
  8. 끝났으니 케이크를 먹어요

지금까지 제가 pbx 파일에 사용한 비주얼 머지 툴 중 가장 좋은 것은 비주얼 스튜디오 코드의 머지 툴입니다.코드 앱에서 pbx 파일을 열고 충돌을 수정한 후 X 코드를 다시 엽니다.

위에서 언급한 바와 같이 가장 일반적인 분쟁 처리 방법은 다음과 같습니다.

  1. "모든 것"을 받아들입니다.
  2. 파일을 프로젝트로 다시 가져옵니다.

위의 (1)을 처리하는 bash-script를 작성했습니다.

이렇게 하면 병합 충돌의 가장 일반적인 경우만 해결됩니다!

#!/bin/bash
#
#
#
if [ $# -eq 0 ]
 then
    echo "File must be provided as argument, darnit!"
    exit 1
fi

if [ $# -eq 2 ]
 then
    echo "only ONE File must be provided as argument, darnit!"
    exit 1
fi


echo "Will remove lines from file:" $1
grep -v "<<<<<" $1  | grep -v ">>>>>>" | grep -v "====" > out.tmp;mv out.tmp $1
echo "Done removing lines from file:" $1

때로는 하나 또는 몇 개의 파일(예: ManagedObjects)이 다른 분기에 재생성될 수 있으므로 병합할 때 하나의 블록에 하나의 파일에 대해 두 개의 선언이 있을 수 있습니다.이 경우 선언 중 하나를 삭제해야 합니다.

저는 이 까다로운 문제를 우연히 접하게 되었습니다.

이러한 충돌을 수동으로 처리하는 대신 시도해 볼 수 있습니다.
피쳐 분기에 있다고 가정합니다.

  1. 깃 체크아웃 마스터.
  2. 내용 복사 위치project.pbxproj
  3. Git 체크아웃을 피쳐 브랜치에 넣고 붙여넣습니다.(의 현재 내용을 덮어씁니다.project.pbxproj)
  4. 달려.

    react-native link
    

xUnique https://github.com/truebit/xUnique, 라는 도구를 만들었습니다. 작동합니다!

VSCODE에서 열어서 충돌하는 병합을 수정할 수 있습니다.IDE에서 몇 가지 색상 주석을 찾거나 텍스트 검색에서 <<< >>>를 찾습니다.

갈등의 90%는 명확하고 갈등의 두 변화를 모두 받아들일 수 있기 때문에 걱정할 필요가 없습니다. xUnique와 같은 도구를 사용하는 것이 많은 도움이 된다는 것을 알았습니다.

가장 좋은 방법은 둘을 합치지 않고 단순히 자신의 버전이나 자신의 버전을 전부 받아들이는 것일 수도 있습니다.또한 문제의 파일이 저장소에 있어야 하는 파일인지 여부도 고려해 보십시오. 각 사용자가 자신의 파일 버전을 갖도록 하는 것이 더 적절할 수 있습니다.

충돌 해결 방법에 대한 설명서를 확인합니다.

언급URL : https://stackoverflow.com/questions/2004135/how-to-merge-conflicts-file-project-pbxproj-in-xcode-use-svn

반응형