Mam dwa projekty SVN w użyciu z innego repozytorium SVN przy użyciu svn: externals .
Jak mogę mieć taką samą strukturę układu repozytorium w Git?
git submodule
mogę teraz emulować svn:external
(od marca 2013).
Mam dwa projekty SVN w użyciu z innego repozytorium SVN przy użyciu svn: externals .
Jak mogę mieć taką samą strukturę układu repozytorium w Git?
git submodule
mogę teraz emulować svn:external
(od marca 2013).
Odpowiedzi:
Git ma dwa podejścia podobne do svn, ale nie do końca równoważne: externals:
Scalanie poddrzewa wstawia kod projektu zewnętrznego do oddzielnego podkatalogu w repozytorium. Ma to szczegółowy proces konfiguracji, a następnie jest bardzo łatwe dla innych użytkowników, ponieważ jest automatycznie dołączane, gdy repozytorium jest sprawdzane lub klonowane. Może to być wygodny sposób na uwzględnienie zależności w projekcie.
Wyciąganie zmian z innego projektu jest łatwe, ale przesyłanie zmian z powrotem jest skomplikowane. A jeśli inny projekt musi zostać scalony z Twojego kodu, historie projektów zostaną scalone, a dwa projekty w rzeczywistości staną się jednym.
Podmoduły Gita ( ręczne ) łączą się z konkretnym zatwierdzeniem w repozytorium innego projektu, podobnie jak svn: externals z-r
argumentem. Podmoduły są łatwe do skonfigurowania, ale wszyscy użytkownicy muszą zarządzać podmodułami, które nie są automatycznie uwzględniane w kasach (lub klonach).
Chociaż łatwo jest przesłać zmiany z powrotem do innego projektu, może to spowodować problemy, jeśli repozytorium uległo zmianie. Dlatego generalnie nie jest właściwe zgłaszanie zmian z powrotem do projektu, który jest w trakcie opracowywania.
svn:externals
. W wersji 1.5 składnia została zmieniona na bardziej elastyczny format. Dodano względne adresowanie adresów URL.
Jak wspomniałem w " Aktualizacja podmodułu Git do nowej wersji ", możesz osiągnąć tę samą zewnętrzną funkcję SVN z podmodułami Git 1.8.2:
git config -f .gitmodules submodule.<path>.branch <branch>
To wystarczy, aby podmoduł podążał za odgałęzieniem (jak w NAJNOWSZYM zatwierdzeniu zdalnej gałęzi zdalnego repozytorium submodułu ). Wszystko, co musisz zrobić, to:
git submodule update --remote
To zaktualizuje podmoduł.
Więcej szczegółów w „ git submodule
śledzeniu najnowszych ”.
Aby przekształcić istniejący podmoduł w jeden śledzący gałąź : zobacz wszystkie kroki w „ Podmoduły Git: Określ gałąź / tag ”.
svn:externals
?
--depth
ale tak naprawdę nie rozwiązuje problemu.
Jestem autorem narzędzia gil (linki git)
Mam alternatywne rozwiązanie tego problemu - narzędzie gil (git links)
Pozwala opisywać i zarządzać złożonymi zależnościami repozytoriów git.
Zapewnia również rozwiązanie problemu zależności rekurencyjnych podmodułów w git .
Weź pod uwagę, że masz następujące zależności projektu: przykładowy wykres zależności repozytorium git
Następnie możesz zdefiniować .gitlinks
plik z opisem relacji repozytoriów:
# Projects
CppBenchmark CppBenchmark https://github.com/chronoxor/CppBenchmark.git master
CppCommon CppCommon https://github.com/chronoxor/CppCommon.git master
CppLogging CppLogging https://github.com/chronoxor/CppLogging.git master
# Modules
Catch2 modules/Catch2 https://github.com/catchorg/Catch2.git master
cpp-optparse modules/cpp-optparse https://github.com/weisslj/cpp-optparse.git master
fmt modules/fmt https://github.com/fmtlib/fmt.git master
HdrHistogram modules/HdrHistogram https://github.com/HdrHistogram/HdrHistogram_c.git master
zlib modules/zlib https://github.com/madler/zlib.git master
# Scripts
build scripts/build https://github.com/chronoxor/CppBuildScripts.git master
cmake scripts/cmake https://github.com/chronoxor/CppCMakeScripts.git master
Każda linia opisuje łącze git w następującym formacie:
Na koniec musisz zaktualizować swoje główne repozytorium próbek:
# Clone and link all git links dependencies from .gitlinks file
gil clone
gil link
# The same result with a single command
gil update
W rezultacie sklonujesz wszystkie wymagane projekty i połączysz je ze sobą w odpowiedni sposób.
Jeśli chcesz zatwierdzić wszystkie zmiany w jakimś repozytorium ze wszystkimi zmianami w podrzędnych repozytoriach połączonych, możesz to zrobić za pomocą jednego polecenia:
gil commit -a -m "Some big update"
Polecenia pull, push działają w podobny sposób:
gil pull
gil push
Narzędzie Gil (git links) obsługuje następujące polecenia:
usage: gil command arguments
Supported commands:
help - show this help
context - command will show the current git link context of the current directory
clone - clone all repositories that are missed in the current context
link - link all repositories that are missed in the current context
update - clone and link in a single operation
pull - pull all repositories in the current directory
push - push all repositories in the current directory
commit - commit all repositories in the current directory
Więcej o problemie zależności rekurencyjnych podmodułów w git .
gil
.