Czy można mieć 2 repozytoria git w jednym katalogu? Nie sądzę, ale pomyślałem, że zapytam. Zasadniczo chciałbym sprawdzić pliki konfiguracyjne mojego katalogu domowego (np. Emacs), które powinny być wspólne dla wszystkich maszyn, na których pracuję, ale mam drugie repozytorium dla plików lokalnych (np. .Emacs.local), które zawiera konfiguracje specyficzne dla maszyny. Jedynym sposobem, o jakim mogę to zrobić, jest umieszczenie lokalnej konfiguracji w podkatalogu i zignorowanie tego podkatalogu z głównego repozytorium git. Jakieś inne pomysły?
git
git-submodules
git-subrepo
Joe Casadonte
źródło
źródło
git subtree
wykona pracę.Odpowiedzi:
Jeśli rozumiem, co robisz, możesz to wszystko obsłużyć w jednym repozytorium, używając oddzielnych gałęzi dla każdego komputera i gałęzi zawierającej wspólne pliki konfiguracyjne katalogu domowego.
Zainicjuj repozytorium i zatwierdź do niego wspólne pliki, być może zmieniając nazwę gałęzi MASTER na Common. Następnie utwórz stamtąd oddzielną gałąź dla każdego komputera, z którym pracujesz, i zatwierdź pliki specyficzne dla komputera w tej gałęzi. Za każdym razem, gdy zmieniasz swoje wspólne pliki, połącz wspólną gałąź z każdą gałęzią maszyny i wypchnij ją na inne maszyny (napisz do tego skrypt, jeśli jest ich wiele).
Następnie na każdym komputerze wyewidencjonuj gałąź tego komputera, która będzie również zawierać typowe pliki konfiguracyjne.
źródło
Ten artykuł opisuje to stosunkowo dobrze:
https://github.com/rrrene/gitscm-next/blob/master/app/views/blog/progit/2010-04-11-environment.markdown
Zasadniczo, jeśli pracujesz z wiersza poleceń, jest to prostsze niż mogłoby się wydawać. Załóżmy, że chcesz 2 repozytoria git:
Możesz je skonfigurować tak:
Możesz dodać plik i zatwierdzić go tylko do jednego w ten sposób:
Zatem najpierw są opcje dla git, potem polecenie, a na końcu opcje polecenia git. Możesz łatwo aliasować polecenie git, takie jak:
Możesz więc zobowiązać się do jednego lub drugiego, nieco mniej wpisując, na przykład
gitone commit -m "blah"
.To, co wydaje się być trudniejsze, jest ignorowane. Ponieważ .gitignore zwykle znajduje się w katalogu głównym projektu, musiałbyś znaleźć sposób na zmianę tego również bez przełączania całego katalogu głównego. Lub możesz użyć .git / info / exclude, ale wszystkie ignorowania, które następnie wykonujesz, nie zostaną zatwierdzone ani przesunięte - co może zepsuć innych użytkowników. Inni używający któregokolwiek repozytorium mogą wypchnąć plik .gitignore, co może powodować konflikty. Nie jest dla mnie jasne, jak najlepiej rozwiązać te problemy.
Jeśli wolisz narzędzia GUI, takie jak TortoiseGit, będziesz miał również pewne wyzwania. Możesz napisać mały skrypt, który tymczasowo zmienia nazwę .gitone lub .gittwo na .git, aby spełnić założenia tych narzędzi.
źródło
alias gitone='git --git-dir=.gitone'
gitone config core.excludesfile gitone.exclude
igitone add gitone.exclude
. Zrobiłem skrypt, który rozwija to rozwiązanie: github.com/capr/multigitgit config --global alias.youralias '!git --git-dir="/d/MyProject/_git"'
wtedy takgit youralias status
:).gitignore
pliki są zwykle ustawiane i zapomniane, możesz wykonać różne kopie dla każdego repozytorium, a następnie skopiować odpowiednią wersję do katalogu jako część aliasu. Dotyczy to innych plików w katalogu głównym, które mogą powodować konflikty, takich jakREADME.md
i.gitattributes
.Przyjrzyj się podmodułowi git .
źródło
RichiH napisał narzędzie o nazwie vcsh, które jest narzędziem do zarządzania plikami dotfiles przy użyciu fałszywych gołych repozytoriów git w celu umieszczenia więcej niż jednego katalogu roboczego w $ HOME. Nie ma to nic wspólnego z csh AFAIK.
Jeśli jednak masz wiele katalogów, alternatywą dla git-submodules (które są uciążliwe w najlepszych okolicznościach, a to przykładowe użycie nie jest najlepsze) jest gitslave, które pozostawia niewolnicze repozytoria sprawdzone na czubku rozgałęzienia przez cały czas i nie wymaga trzyetapowego procesu, aby dokonać zmiany w repozytorium zależnym (wyewidencjonowanie do właściwej gałęzi, dokonanie i zatwierdzenie zmiany, a następnie przejście do superprojektu i zatwierdzenie nowego modułu podrzędnego).
źródło
Jest to możliwe przy użyciu zmiennej,
GIT_DIR
ale wiąże się z wieloma zastrzeżeniami, jeśli nie wiesz, co robisz.źródło
Tak, podmoduły są prawdopodobnie tym, czego chcesz. Inną opcją byłoby umieszczenie kopii roboczej w podkatalogu, a następnie wskazanie dowiązań symbolicznych z katalogu domowego do interesujących nas plików.
źródło
moją preferowaną metodą jest użycie repozytorium w podkatalogu i rekurencyjne dowiązania symboliczne:
gdzie plik ' repo / build ' wygląda następująco:
uwaga : nie używaj „git add”.
źródło
Inną opcją jest umieszczenie ich w oddzielnych folderach i utworzenie symbolicznych twardych łączy z jednego folderu do drugiego.
Na przykład, jeśli istnieją repozytoria:
I:
Możesz utworzyć dowiązanie symboliczne do folderów
FolderA
iFolderB
z Repo1 do Repo2. W przypadku systemu Windows polecenie do uruchomienia na Repo1 wyglądałoby tak:W przypadku plików w głównych repozytoriach musiałbyś dowiązać symboliczne do każdego z nich, dodając je również do repozytorium,
.gitignore
aby uniknąć szumów, chyba że chcesz.źródło
Zastrzeżenie: to nie jest reklama. Jestem programistą dostarczonej biblioteki.
Stworzyłem rozszerzenie git do obsługi przypadków, w których chcesz mieszać wiele repozytoriów w jednym folderze. Zaletą lib jest śledzenie repozytoriów i konfliktów plików. można go znaleźć na githubie . Istnieją również 2 przykładowe repozytoria do wypróbowania.
źródło