Jaka jest najlepsza praktyka umieszczania wielu projektów w repozytorium git? [Zamknięte]

188

Z jakiegoś powodu mam tylko jedno repozytorium .
Ale mam wiele projektów, w tym javaprojekty php scriptsi Androidprojekty aplikacji.

Teraz mój problem polega na tym, że muszę umieścić je w różnych podfolderach w repozytorium.
Używam różnych IDE. Wiesz, każde IDE może mieć własny obszar roboczy.

Kto może mi powiedzieć najlepszą praktykę rozwiązania problemu?

Kamienny
źródło
1
Możliwym rozwiązaniem może być stackoverflow.com/questions/5514739/… lub stackoverflow.com/a/7931825/828197
Ragnarokkr
2
Nie jesteś sam. Mam podobne przypadki z moimi repozytoriami, których używam do celów edukacyjnych (przykład: github.com/hopbit/java-sandbox ). Nie chcę tworzyć nowego repozytorium, aby wypróbować przykłady każdej nowej książki / samouczka, który zaczynam czytać ...
Łukasz Siwiński,
Jednym z powodów, dla których chcesz to zrobić, jest posiadanie jednego projektu, którym jest kod produktu, który wdrażasz w środowiskach wykonawczych, takich jak test lub produkcja. Drugi projekt to aplikacja, która testuje system (na przykład BDD) pierwszy projekt. Pomiędzy tymi dwoma projektami istnieje ścisła zależność, a teraz możesz zachować / odwołać się do całości przy użyciu jednego adresu repozytorium.
Lance Kind
Podsumowanie jak poniżej „Git nie ma pojęcia, czy są to części tego samego czy innego projektu”
ahmednabil88,

Odpowiedzi:

198

Podczas gdy większość ludzi powie Ci, abyś używał wielu repozytoriów, uważam, że warto wspomnieć o innych rozwiązaniach.

Rozwiązanie 1

Jedno repozytorium może zawierać wiele niezależnych gałęzi, zwanych gałęziami osieroconymi . Oddziały sieroce są całkowicie oddzielone od siebie; nie dzielą się historiami.

git checkout --orphan BRANCHNAME

Spowoduje to utworzenie nowej gałęzi, niezwiązanej z bieżącą gałęzią. Każdy projekt powinien znajdować się we własnej osieroconej gałęzi.

Teraz z jakiegokolwiek powodu, git potrzebuje trochę porządkowania po sierocie przy kasie.

rm .git/index
rm -r *

Upewnij się, że wszystko zostało zatwierdzone przed usunięciem

Po oczyszczeniu gałęzi sierocej możesz z niej korzystać normalnie.

Rozwiązanie 2

Unikaj wszelkich kłopotów z sierocymi gałęziami. Utwórz dwa niezależne repozytoria i wypchnij je do tego samego pilota. Wystarczy użyć różnych nazw gałęzi dla każdego repozytorium.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Jacob Groundwater
źródło
Wielkie dzięki, że powinno być w stanie rozwiązać mój problem. W rzeczywistości oba rozwiązania wykorzystują oddziały do ​​przechowywania różnych projektów.
Kamienisty
6
Nie jestem pewien, czy rozumiem rozwiązanie 2. Czy mówisz, że zatwierdzasz wszystkie pliki .git w głównym repozytorium git? Czym różni się używanie wielu osieroconych gałęzi od używania wielu gałęzi?
Nate
14
@Nate To, co mówi, to: utwórz dwa osobne lokalne repozytoria, a następnie wypchnij je oba do tego samego zdalnego repozytorium na GitHub.
Facet z kapeluszem,
1
Dzięki @TheGuywithTheElfHat. Teraz, kiedy patrzę na to ponownie (9 miesięcy później), wydaje mi się to jasne. Rozwiązanie 2 wciąż tworzy osierocone gałęzie, ale widzę, jak łatwiej jest sobie poradzić z tą metodą.
Nate,
21
Rozwiązanie 2 wymaga więcej wyjaśnień
eC Droid
19

Rozwiązanie 3

Służy do korzystania z jednego katalogu dla wielu projektów. Używam tej techniki do niektórych ściśle powiązanych projektów, w których często muszę wprowadzać zmiany z jednego projektu do drugiego. Jest podobny do pomysłu osieroconych gałęzi, ale gałęzie nie muszą być osierocone. Po prostu uruchom wszystkie projekty z tego samego stanu pustego katalogu.

Rozpocznij wszystkie projekty z jednego zatwierdzonego pustego katalogu

Nie oczekuj cudów od tego rozwiązania. Jak widzę, zawsze będziesz mieć problemy z nieśledzonymi plikami. Git tak naprawdę nie ma pojęcia, co z nimi zrobić, więc jeśli istnieją pliki pośrednie wygenerowane przez kompilator i zignorowane przez plik .gitignore, jest prawdopodobne, że przez jakiś czas będą zawieszane, jeśli spróbujesz szybko zamienić między - na przykład - projektem oprogramowania a projektem pracy doktorskiej.

Jednak tutaj jest plan. Rozpocznij, tak jak powinieneś rozpocząć wszelkie projekty git, zatwierdzając puste repozytorium, a następnie uruchom wszystkie projekty z tego samego stanu pustego katalogu. W ten sposób masz pewność, że dwie partie plików są dość niezależne. Nadaj też swoim gałęziom odpowiednią nazwę i nie leniwie używaj po prostu „master”. Twoje projekty muszą być oddzielne, więc nadaj im odpowiednie nazwy.

Git commits (a więc tagi i gałęzie) zasadniczo przechowują stan katalogu i jego podkatalogów, a Git nie ma pojęcia, czy są to części tego samego czy innego projektu, więc naprawdę nie ma problemu z przechowywaniem różnych projektów w tym samym repozytorium. Problem polega na tym, aby wyczyścić nieśledzone pliki z jednego projektu podczas korzystania z innego lub oddzielić projekty później.

Utwórz puste repozytorium

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Zacznij swoje projekty od pustych.

Pracuj nad jednym projektem.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Rozpocznij kolejny projekt

kiedykolwiek chcesz.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Przełączaj się tam iz powrotem

W dowolnym momencie możesz przechodzić między projektami. Ten przykład wraca do projektu oprogramowania szachowego.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

Nieśledzone pliki są denerwujące

Podczas wymiany między projektami / oddziałami będziesz jednak zirytowany nieśledzonymi plikami.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

To nie jest problem nie do pokonania

Z definicji, git tak naprawdę nie wie, co zrobić z nieśledzonymi plikami i od Ciebie zależy, jak sobie z nimi poradzić. Możesz zatrzymać przenoszenie nieśledzonych plików z jednej gałęzi do drugiej w następujący sposób.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Zapewniając, że katalog jest pusty przed sprawdzeniem naszego nowego projektu, upewniliśmy się, że nie ma zawieszonych nieśledzonych plików z innego projektu.

Wyrafinowanie

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Jeśli te same daty zostaną określone przy każdym zatwierdzeniu pustego repozytorium, wówczas niezależnie utworzone zatwierdzenia pustego repozytorium mogą mieć ten sam kod SHA1. Umożliwia to niezależne utworzenie dwóch repozytoriów, a następnie scalenie ich w jedno drzewo ze wspólnym katalogiem głównym w jednym repozytorium później.

Przykład

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Wynik

Schemat połączonych repozytoriów

Używasz podkatalogów na projekt?

Może to również pomóc, jeśli przechowujesz swoje projekty w podkatalogach, jeśli to możliwe, np. Zamiast plików

chess.prog
philosophy_doctorate.txt 

mieć

chess/chess.prog
thesis/philosophy_doctorate.txt 

W takim przypadku będzie to nieśledzony plik oprogramowania chess/untracked_software_file.prog. Podczas pracy w thesiskatalogu nie powinny przeszkadzać nie śledzone pliki programów szachowych i mogą się zdarzyć sytuacje, w których możesz pracować z radością bez usuwania nieśledzonych plików z innych projektów.

Ponadto, jeśli chcesz usunąć nieśledzone pliki z innych projektów, szybsze (i mniej podatne na błędy) będzie zrzucenie niechcianego katalogu niż usunięcie niechcianych plików poprzez wybranie każdego z nich.

Nazwy oddziałów mogą zawierać znaki „/”

Możesz więc nazwać swoje oddziały jakoś

project1/master
project1/featureABC
project2/master
project2/featureXYZ
Ivan
źródło