Jak poprawnie używać Git z XCode?

Jestem programistą iphone ' a od jakiegoś czasu, a od niedawna włączam Gita do mojego obiegu pracy. Użyłem ustawień Gita znalezionych na http://shanesbrain.net/2008/7/9/using-xcode-with-git dla mojego dotychczasowego obiegu pracy.

Te ustawienia każą gitowi wykluczyć*.pbxproj z merges? Czy istnieje prawdziwy powód, aby to zrobić? Na przykład, gdy dodam plik do projektu i push TO origin, moi koledzy programiści nie będą mieli ten plik dodany do ich projektu xcode, gdy ciągną. Jeśli jeden z nich zbuduje release, ten plik może nie zostać dołączony. Czy nie powinienem pozwolić gitowi zająć się mergami dla pliku projektu? Czy ktoś mógłby mi wyjaśnić dlaczego lub dlaczego nie ten plik powinien się znajdować i jak prawidłowo radzić sobie z sytuacją gdy pliki są dodawane do projektu. Dzięki.

Author: rickharrison, 2010-04-11

5 answers

Pracowałem nad aplikacjami iPhone w pełnym wymiarze czasu od premiery SDK, większość tego czasu spędziłem pracując w zespołach z wieloma programistami.

Prawda jest taka, że o wiele bardziej szkodliwe jest zabronienie tego łączenia .plik pbxproj niż jest pomocny. Jak mówisz, kiedy dodajesz plik, chyba że inni ludzie go dostaną, muszą go również dodać do swojego projektu - w aplikacji o dowolnej wielkości, która jest do bani, a także odbiera ogromną korzyść z kontroli kodu źródłowego, ponieważ nie można naprawdę powróci do pełnego wcześniejszego stanu projektu poprzez git.

The .plik pbxproj jest po prostu listą właściwości (podobną do XML). Z doświadczenia wynika, że prawie jedyny konflikt scalający, jaki kiedykolwiek miałeś, to sytuacja, gdy dwie osoby dodały pliki w tym samym czasie. Rozwiązaniem w 99% przypadków konfliktu merge jest utrzymanie obu stron połączenia, co dla git przynajmniej polega na usunięciu wszelkich >>>>,

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

Najgorszy przypadek, jeśli się nie powiedzie (prosisz XCode, aby załadować projekt i nie załaduje się), po prostu usuń .plik pbxproj, sprawdź master z git i ponownie dodaj swoje pliki. Ale nigdy nie zdarzyło mi się to przez wiele miesięcy użytkowania tego skryptu, ponownie pracując w pełnym wymiarze czasu na aplikacjach iPhone z kilkoma innymi programistami.

Inna opcja (zaznaczona w komentarze poniżej), że można spróbować użyć w miejsce skryptu, jest dodanie tej linii do .plik gitattributes:

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

Wtedy git zawsze weźmie obie strony połączenia dla .pliki pbxproject, mające taki sam efekt jak skrypt podałem tylko bez dodatkowej pracy.

Na koniec, oto moja całość .plik gitignore, pokazujący to, co mam ustawione do zignorowania, ponieważ jest kilka rzeczy, których nie chcesz - w moim przypadku naprawdę tylko resztki Emacsa i cały build katalog:
# xcode noise
build/*
*.pbxuser
*.mode1v3
*~

# old skool
.svn

# osx noise
.DS_Store
profile
 128
Author: Kendall Helmstetter Gelner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-09 15:37:04

Szczerze mówiąc, istniejące odpowiedzi są mylące.

Jeśli nigdy nie usuniesz lub nie zmienisz nazwy plików, dobrym pomysłem jest użycie strategii merge=union, która bezpośrednio łączy różnice w różnych commitach.

Jednak w prawdziwym świecie czasami musimy usuwać lub zmieniać nazwy plików. Łączenie różnic bez żadnej modyfikacji spowodowałoby wiele problemów w takich sytuacjach, a problemy te zwykle prowadzą do " integralności przestrzeni roboczej - Couldn 't load project" problem, który sprawia, że nawet nie możesz uruchomić projektu.

Najlepsze rozwiązanie jakie do tej pory dostałem:

1) Dobrze Zaprojektuj projekt i dodaj wszystkie potrzebne pliki na początku, więc rzadko będziesz musiał zmienić project.pbxproj.

2) Make your features tiny. Nie rób zbyt wielu rzeczy na gałęzi.

3) z dowolnego powodu, jeśli chcesz zmodyfikować strukturę plików i uzyskać konflikty w project.pbxproj, użyj ulubionego edytora tekstu, aby rozwiązać je ręcznie. As you make Twoje zadania malutkie, konflikty mogą być łatwe do rozwiązania.

 6
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-27 07:32:46

To działa dla mnie w Xcode 4.6 i Git 1.7.5.

Dodaj i zatwierdź .gitatt przypisuje Plik tym:

*.pbxproj binary merge=union
Przetestowałem to z innym członkiem zespołu i działa świetnie.

Wzięte z: http://robots.thoughtbot.com/post/33796217972/xcode-and-git-bridging-the-gap

 5
Author: oneyenjug,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-22 18:41:05

Krótka odpowiedź jest taka, że nawet jeśli nie umieścisz tej linii w .gitattributes, możesz nie być w stanie łatwo połączyć dwóch zmodyfikowanych wersji a .pbxproj. Lepiej, żeby git traktował go jako binarny.

Zobacz tutaj po szczegóły: Git i pbxproj

Update: mimo że git book nadal zgadza się z tą odpowiedzią, ja już tego nie robię. I version control my .pbxproj tak jak każdy inny niebinarny plik źródłowy.

 3
Author: Tom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:52

Stworzyłem skrypt Pythona, który może obsługiwać konflikty scalania w plikach projektu Xcode.

Jeśli chcesz spróbować, możesz sprawdzić tutaj: https://github.com/simonwagner/mergepbx

Będziesz musiał zainstalować go jako sterownik scalania, więc zostanie wywołany automatycznie, gdy masz konflikt scalania w pliku projektu (the README.md powie Ci, jak to zrobić).

Powinno działać znacznie lepiej niż używanie merge=union ponieważ mergepbx rozumie semantykę twojego projektu pliku, a zatem poprawnie rozwiąże konflikt.

Jednak projekt jest nadal alpha, nie oczekuj, że zrozumie każdy plik projektu, który tam jest.

 2
Author: Simon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-18 22:41:16