Konfiguracja projektu jest łatwa w git, więc mogę mieć oddzielne repozytorium nawet dla małych skryptów. Teraz problem polega na tym, jak nimi zarządzać.
Pracuję w wielu miejscach z tymi repozytoriami. Kiedy dokonałem zmian w jakimś repozytorium, chcę mieć możliwość aktualizowania repozytoriów w innych miejscach.
Mam więc katalog z wieloma repozytoriami.
- Jak mogę je wszystkie pobrać?
- Jak mogę sprawdzić, czy któryś z nich ma niezatwierdzone zmiany?
- Jak mogę sprawdzić, czy któryś z nich ma zmiany do scalenia?
Byłoby miło móc to zrobić jednym poleceniem.
Wyjście musi być na tyle ciche, aby faktycznie było widoczne, co należy zrobić.
hg mercurial
.Odpowiedzi:
Bardzo polecam narzędzie wielu repozytoriów mr . Używałem przez jakiś czas niestandardowego skryptu powłoki, zgodnie z zaleceniami innych, ale korzystanie z mr ma dla mnie następujące zalety:
Odnośnie twojego pytania o ciche wyjście: Poziom szczegółowości można zmienić za pomocą przełącznika wiersza poleceń -q. Wolę domyślne wyjście, które wydaje się ładnie ujednolicać dane wyjściowe w krótkim i jasnym podsumowaniu.
Używam następującego aliasu dla polecenia mr, aby upewnić się, że mr zawsze wybiera moją domyślną listę projektów przechowywaną w $ HOME i używa 5 równoległych wątków:
źródło
alias pa='find . -name .git -print -execdir git pull \;'
wtedypa
wystarczyMuszę powiedzieć, że zacząłem od aktualnie zaakceptowanej odpowiedzi (tylko kilka skryptów pomocniczych, które iterują po repozytoriach), ale w sumie brakowało mi tego doświadczenia.
Tak więc, po wypróbowaniu mr, repo i git-submodules, okazało się, że w każdym z nich brakowało w inny sposób, więc w końcu zrobiłem swój własny wariant: http://fabioz.github.io/mu-repo, który jest dojrzałym narzędziem w ten punkt - ma przepływy pracy, które pozwalają:
Zauważ, że obsługuje każdy system operacyjny, na którym działa Python;)
źródło
mu sh <some command>
wykonać dowolne polecenie również w wielu repozytoriach, cała jego ostateczność dotyczy git, a nie innych systemów kontroli wersji. .Jeśli tego potrzebujesz, tak, użyj innego narzędzia.gr (git-run) rozszerzafunkcjonalność mr (tylko dla
git
). Uważam, że łatwiej jest zorganizować wiele repozytoriów git za pomocą jego systemu tagów. Kod dlagr
nie jest jednak dobrze utrzymany. Jeśli używasz basha, upewnij się, że używasz go zformą-t tag
zamiast#tag
.źródło
Możesz spróbować użyć repozytorium z niestandardowym
manifest.xml
plikiem, aby określić, gdzie są twoje repozytoria. Istnieje dokumentacja jak to zrobić.Alternatywnie możesz użyć
git-submodule(1
) .źródło
Napisałem narzędzie o nazwie „ RepoZ ”, które automatycznie wykrywa repozytoria git, gdy tylko je sklonujesz lub zmieniasz cokolwiek w nich, na przykład przełączanie gałęzi.
Po znalezieniu repozytoria są „śledzone”. To po prostu pokaże je na liście lokalnych repozytoriów, zawierającej obszerne informacje o statusie inspirowane posh-git . Zawiera bieżącą gałąź i inne rzeczy, takie jak edycje plików i liczbę zatwierdzeń przychodzących lub wychodzących.
Pomaga to śledzić lokalne repozytoria i niedokończoną pracę do zatwierdzenia lub wypchnięcia. Ponadto możesz użyć listy repozytoriów jako nawigacji do przełączania się z jednego repozytorium do drugiego.
„Jak mogę je wszystkie pobrać?”
Wersja dla systemu Windows oferuje menu kontekstowe do pobierania lub pobierania repozytorium. Dzięki wielokrotnemu wyborowi możesz uruchamiać akcje na wielu repozytoriach jednocześnie.
Może się jednak okazać, że bardzo przydatna jest inna funkcja:
Dzięki funkcji automatycznego pobierania możesz powiedzieć RepoZ, aby okresowo pobierał w tle piloty wszystkich repozytoriów git. Te pobrania nie kolidują oczywiście z lokalnymi zatwierdzeniami. Nie ma lokalnych prób scalania, takich jak z
git pull
.źródło
gitslave to narzędzie, które może uruchomić to samo polecenie w wielu repozytoriach, tworząc relację superprojekt / podprojekt między superprojektem a podprojektem. To (domyślnie) zapewnia podsumowanie wyników, dzięki czemu możesz skoncentrować się na repozytoriach, które zapewniają unikalne dane wyjściowe (przydatne dla statusu git, niezbyt przydatne dla git ls-files).
Jest to zwykle używane w projektach, w których musisz złożyć kilka repozytoriów razem i trzymać je w tej samej gałęzi lub tagu w tym samym czasie lub cokolwiek. Dla mojego katalogu (czystych) repozytoriów mam tylko mały plik makefile, który pozwala mi uruchamiać dowolne polecenia git, których, jak widzisz, używam głównie dla fsck i gc:
źródło
Stworzyłem alias i funkcję do uruchamiania dowolnego polecenia git we wszystkich repozytoriach dostępnych w katalogu (rekurencyjnie). Znajdziesz go tutaj: https://github.com/jaguililla/dotfiles/git
To jest kod:
Mam nadzieję, że to pomoże :)
źródło
.bash_aliases
:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
. Źródło go, a następnie nprgit status
. Zadzwoń .Możesz do tego użyć
git-status-all
klejnotu: https://github.com/reednj/git-status-allIstnieje również opcja pobierania, która pobierze ze źródła dla wszystkich repozytoriów przed wyświetleniem statusu:
źródło
find . -name .git -print -execdir git status \;
jest OKUżywam tego skryptu do łatwego wykonywania poleceń git we wszystkich moich repozytoriach.
Domyślnie skrypt będzie szukał repozytoriów git w ~ / cm / src, ale możesz to zmienić, ustawiając zmienną środowiskową GITREPO według własnych upodobań.
Ten skrypt jest oparty na tym skrypcie .
źródło
find . -name .git -print -execdir git pull \;
robi to, co myślisz.Napisałem narzędzie wiersza poleceń o nazwie gita do zarządzania wieloma repozytoriami. Pokazuje na przykład status zarejestrowanych repozytoriów obok siebie
Może również delegować polecenia / aliasy git z dowolnego katalogu roboczego.
Teraz, aby odpowiedzieć na pytania za pomocą tego narzędzia:
W
gita ls
podaje komunikat 3 możliwych znaków obok nazwy gałęzi, co wskazuje+
: zmiany etapowe*
: zmiany niestacjonarne_
: nieśledzone pliki / folderyNazwy gałęzi są pokolorowane na 5 sposobów
Aby go zainstalować, po prostu uruchom
źródło
Jeśli ktoś nadal przegląda ten wątek, sprawdź mój skrypt powłoki o nazwie gitme
będziesz musiał ręcznie wprowadzić lokalne repozytoria git, ale używam tego narzędzia codziennie do współpracy z wieloma projektami git na wielu komputerach.
możesz biec
git clone https://github.com/robbenz/gitme.git
również skrypt jest zamieszczony poniżej
Ustawiam alias w moim ~ / .bash_profile, więc
alias gitme='sh /path/to/gitme.sh'
źródło
Powinieneś sprawdzić rgit w CPAN, który rekurencyjnie wykonuje polecenia git we wszystkich repozytoriach w drzewie katalogów.
Z dokumentów:
źródło
Właśnie stworzyłem narzędzie, które robi, co chcesz!
gmaster fetch
gmaster status
gmaster status
Nazywa się gitmaster: https://github.com/francoiscabrol/gitmaster
źródło
Napisałem tę prostą funkcję bash do mojego .bash_profile, aby móc uruchomić git, maven, gradle lub dowolne inne polecenie bash tylko we wszystkich repozytoriach git:
Można to wykorzystać w ten sposób
źródło
Zastrzeżenie: pracuję nad tym narzędziem pod adresem www.repoflow.com
Pracuję nad tym, ale jest to również rozwiązywanie pytań dotyczących OP i ogólnie pomoc w zarządzaniu wieloma repozytoriami. Możesz użyć interfejsu użytkownika lub bazowego interfejsu API GraphQL do tworzenia własnych skryptów, rozważ to jako inną opcję.
źródło
Jest przydatne narzędzie do pobierania wszystkich wielu repozytoriów.
git-pull-all
to narzędzie wiersza poleceń do wykonywania na wielu repozytoriach git asynchronicznie.Instalacja
Stosowanie
Załóżmy, że masz te pliki i katalogi:
Kiedy uruchamiasz
git-pull-all
polecenie w~/Projects
katalogu, powinno ono znaleźć repozytoria potomne git (w powyższym przypadku cool-examples i super-express ), a następnie wykonaćgit pull
na każdym z nich.Łącze GitHub: https://github.com/tatsuyaoiw/git-pull-all
źródło
Używam kodu Visual Studio. Mamy około 20 bibliotek w naszej bazie kodu, z których wszystkie są oddzielnymi repozytoriami Git, a karta kontroli źródła w programie Visual Studio Code jest całkiem dobra, aby zobaczyć „na pierwszy rzut oka”, jak daleko w tyle lub przed lokalnymi repozytoriami są. Istnieją również ustawienia okresowego pobierania, aby informacje były aktualne, a także przycisk odświeżania.
Nie jest to tak wygodne, jak skrypt, ale jeśli chodzi o kontrolę źródła, to lubię być tym, który wprowadza zmiany. Potrzeba bardzo dobrze napisanego skryptu, aby uważać, aby nie nadpisać zmian itp. Dzięki podejściu VS Code szybko uzyskujesz dużą ilość informacji, które możesz wykorzystać samodzielnie.
Oto zrzut ekranu, jak to wygląda:
źródło
Znalazłem świetne rozwiązanie do pobierania z bieżącej gałęzi ze wszystkich podkatalogów, które mają folder .git, nawet jeśli każde repozytorium ma wyewidencjonowaną inną gałąź. Polecenie jest jednolinijkowe, na tyle elastyczne, że można je modyfikować dla różnych poleceń git i można je aliasować.
Po prostu skopiuj i wklej następujące elementy:
Rozbijając to:
Znajdź wszystkie katalogi (-type d) w bieżącym katalogu (find.), Które mają nazwę „.git” (-name .git), szukając maksymalnie dwóch katalogów w głąb (2 zamiast 1, ponieważ szukamy git w folderze repo git).
Uruchom następujące polecenie powłoki (exec sh -c)
Zmień katalog na pierwszy argument (cd $ 0), następnie zmień katalog o jeden poziom wyżej, aby opuścić folder .git (cd ..), a następnie wykonaj polecenie git pull origin podczas określania gałęzi, uruchamiając git rev-parse ... dla bieżącej gałęzi Zatwierdź HEAD.
„{}” To ścieżka względna wyniku, którą otrzymujemy z początkowego znalezienia polecenia . The; służy do zakończenia polecenia.
Testowano na MacOS 10.14.6 na zsh. Tak jak jest, działa tylko wtedy, gdy zdalne i lokalne oddziały mają taką samą nazwę, AFAIK.
Możesz to zmienić, aby uzyskać status. Spodziewam się, że możesz dodać argumenty, aby uczynić to bardziej elastycznym, ale jeszcze nie próbowałem.
źródło
https://github.com/wwjamieson3/envisionTools ma skrypt bash o nazwie gitstat, który robi to i wiele więcej. Jest kompatybilny z GNU i Mac. Jeśli zostaniesz o to poproszony, może wykonać pobieranie z pilotów. Pokazuje nieśledzone, zmodyfikowane, dodane, usunięte i przemieszczone pliki. Różni się od pilotów, pokazując niezintegrowane zatwierdzenia na pilotach i niezakończone zatwierdzenia lokalne. Może również wyświetlać wyniki oznaczone kolorami w trybie podsumowania lub szczegółowym, a nawet HTML. Używa locate zamiast find, ponieważ jest nieskończenie szybszy, a nawet monituje o aktualizację bazy danych lokalizowania, jeśli stanie się zbyt stara.
źródło
Wygląda na to, że napisanie scenariusza, który to zrobi, jest dość łatwe. Zasadniczo musi iterować repozytoria, a następnie używać poleceń takich jak git ls-files, git diff i git log.
źródło