2009-03-17 9 views
12

Używam git do interfejsu z repozytorium SVN. Mam kilka oddziałów git dla różnych projektów, nad którymi pracuję.Przepływ pracy git i C++, jak obsługiwać pliki obiektów i archiwów?

Teraz, gdy przełączam się z jednej gałęzi na drugą przy użyciu "git checkout", wszystkie skompilowane pliki wykonywalne i pliki obiektów z poprzedniej gałęzi nadal istnieją. Chciałbym zobaczyć, że przełączenie z gałęzi A na B powoduje, że drzewo zawiera wszystkie pliki obiektów i pliki binarne od czasu, gdy ostatnio pracowałem w gałęzi B.

Czy istnieje sposób na obsłużenie tego bez tworzenia wielu repozytoriów git? ?

Aktualizacja: Rozumiem, że pliki wykonywalne i pliki binarne nie powinny znaleźć się w repozytorium. Jestem trochę rozczarowany faktem, że wszystkie rozgałęzione rzeczy w GIT są dla mnie bezużyteczne, ponieważ okazało się, że będę musiał sklonować moje repozytorium git proxy dla każdej gałęzi, którą chcę uruchomić. Coś, co już zrobiłem dla SVN i miałem nadzieję uniknąć z git. Oczywiście nie muszę tego robić, ale spowodowałoby to, że robiłem nowy make przez większość czasu po przełączeniu między gałęziami (nie jest to zabawne).

+0

Należy kasy różnych oddziałów do różnych katalogów, albo ja coraz pytanie nie tak? – schnaader

+0

Dlaczego w ogóle chcesz, aby pliki wykonywalne i pliki binarne były w ogóle kontrolowane? – n0rd

+0

Jak wskazano w odpowiedzi, dobrym rozwiązaniem jest zbudowanie w oddzielnym folderze, w którym znajdują się źródła. Ale klonowanie lokalnych repozytoriów git jest naprawdę szybkie, więc może nie jest tak źle. – Ismael

Odpowiedz

9

To, czego potrzebujesz, to pełny kontekst, a nie tylko gałąź ... która jest ogólnie poza zakresem narzędzia kontroli wersji. Najlepszym sposobem na to jest użycie wielu repozytoriów.

Nie przejmuj się nieskutecznością tego ... Zrób drugie repozytorium klonem pierwszego. Git automatycznie użyje linków, aby uniknąć posiadania wielu kopii na dysku.

Oto hack dać chcesz chcesz

Skoro masz oddzielne katalogi obj, można zmodyfikować Makefile, aby lokalizacja baza dynamiczny za pomocą czegoś takiego:

OBJBASE = `git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1\//'` 
OBJDIR = "$(OBJBASE).obj" 
# branch master: OBJBASE == "master/", OBJDIR == "master/.obj" 
# non-git checkout: OBJBASE == "", OBJDIR == ".obj" 

Że będzie tylko twoja nazwa oddziału w OBJBASE, której możesz użyć do zbudowania swojej aktualnej lokalizacji objdir. Zostawię to, abyś zmodyfikował go tak, by pasował do twojego środowiska i uczynił go przyjaznym dla użytkowników GIF-ów.

1

Pliki te nie są śledzone przez Git lub Subversion, więc są pozostawione same sobie z założeniem, że są dla ciebie użyteczne.

Po prostu wykonuję moje kasje w różnych katalogach. Oszczędza mi kłopotów z czyszczeniem.

6

To nie jest specyfikacja git lub svn - powinieneś mieć swój kompilator i inne narzędzia skierować wyjście plików pośrednich, takich jak pliki .o, do katalogów, które nie są pod kontrolą wersji.

+0

Czy to standardowa praktyka? Obecnie nasze drzewo jest podzielone na osobne katalogi src dla każdego modułu z towarzyszącymi katalogami obj i lib. Jakieś wskazówki, jak to zrobić inaczej (w standardowy sposób)? –

+1

Nie ma znaczenia, gdzie w drzewie są tak długie, jak zawartość jest wykluczona z kontroli przez mechanizmy takie jak svn: ignore –

+2

Nie spowoduje to, że pliki obiektów będą zgodne z jego kasą. Próbuje uniknąć "oczyszczenia" przy zmianie gałęzi. –

3

Możesz ustawić swój kompilator IDE, aby generował wszystkie prywatne pliki tymczasowe (.class i tak dalej) w <output>\branchName\....

Konfigurując ustawienia kompilacji gałęzi według gałęzi, można zarejestrować nazwę oddziału w ścieżce katalogu wyjściowego.

W ten sposób, nawet jeśli prywatne pliki pozostają po git checkout, twój projekt w nowym oddziale jest gotowy do pracy.

3

W katalogu contrib/ w dystrybucji git znajduje się skrypt o nazwie git-new-workdir, który umożliwia pobranie wielu gałęzi w różnych katalogach bez klonowania repozytorium.

0

Czyszczenie makijażu nie powinno być konieczne, ponieważ pliki różniące się między oddziałami są sprawdzane z aktualną datą !!!

Oznacza to, że jeśli twój plik Makefile jest poprawny, tylko te pliki obiektów, biblioteki i pliki wykonywalne są kompilowane ponownie, które naprawdę zmieniły się z powodu zamówienia. Z tego właśnie powodu plik Makefile jest na pierwszym miejscu.

Wyjątkiem jest sytuacja, w której trzeba zmienić opcje kompilatora, a nawet kompilatory w różnych gałęziach. W takim przypadku prawdopodobnie git-new-workdir jest najlepszym rozwiązaniem.

5

Aby zachować wielokrotne kasacje tego samego repo, można użyć git - work-tree. Na przykład

mkdir $BRANCH.d 
GIT_INDEX_FILE=$BRANCH.index git --work-tree $BRANCH.d checkout $BRANCH 
0

Jeśli skompilowane pliki wykonywalne są pliki, które zostały skontrolowane
następnie git zapas rozwiązuje problem.

[compile] 
git stash save "first branch" 
git checkout other_branch 
[Fiddle with your code] 
[compile] 
git stash save "second branch" 
git checkout first_branch 
git stash apply [whatever index your "first branch" stash has] 
# alternatively git stash pop [whatever index...] 

Jeśli skompilowane pliki wykonywalne są pliki, które nie zostały i nie zostaną skontrolowane
następnie po prostu dodać je do .gitignore

Powiązane problemy