Das Einrichten eines Projekts ist in Git einfach und so kann ich auch für kleine Skripte ein separates Repository haben. Jetzt ist das Problem, wie man sie verwaltet.
Ich arbeite an mehreren Orten mit diesen Repositories. Wenn ich Änderungen an einem Repository vorgenommen habe, möchte ich die Repositorys an anderen Stellen aktualisieren können.
Ich habe also ein Verzeichnis mit vielen Repositorys.
- Wie kann ich alle abrufen?
- Wie kann ich überprüfen, ob einer von ihnen nicht festgeschriebene Änderungen aufweist?
- Wie kann ich überprüfen, ob bei einem von ihnen Änderungen zum Zusammenführen vorgenommen wurden?
Und es wäre schön, dies mit einem Befehl tun zu können.
Die Ausgabe muss leise genug sein, um die zu erledigenden Aufgaben tatsächlich zu bemerken.
hg mercurial
.Antworten:
Ich empfehle das Tool für mehrere Repositorys mr . Ich habe einige Zeit ein benutzerdefiniertes Shell-Skript verwendet, wie von anderen empfohlen, aber die Verwendung von mr hat für mich die folgenden Vorteile:
Zu Ihrer Frage zur stillen Ausgabe: Der Grad der Ausführlichkeit kann mit dem Befehlszeilenschalter -q geändert werden. Ich bevorzuge die Standardausgabe, die die Ausgabe in einer kurzen und klaren Zusammenfassung schön zu vereinheitlichen scheint.
Ich verwende den folgenden Alias für den Befehl mr, um sicherzustellen, dass mr immer meine in $ HOME gespeicherte Standardprojektliste aufnimmt und 5 parallele Threads verwendet:
quelle
alias pa='find . -name .git -print -execdir git pull \;'
dannpa
ist genugIch muss sagen, dass ich mit der aktuell akzeptierten Antwort begonnen habe (nur ein paar Helfer-Skripte, die über die Repositorys iterieren), aber alles in allem war es eine fehlende Erfahrung für mich.
Nachdem ich mr-, repo- und git-Submodule ausprobiert hatte, stellte ich fest, dass jedes auf unterschiedliche Weise fehlte, und machte schließlich meine eigene Variante: http://fabioz.github.io/mu-repo , ein ausgereiftes Tool bei Dieser Punkt - es hat Workflows, mit denen Sie:
Beachten Sie, dass es jedes Betriebssystem unterstützt, auf dem Python ausgeführt wird;)
quelle
mu sh <some command>
einen beliebigen Befehl auch in mehreren Repos ausführen können , befasst sich seine gesamte Endgültigkeit mit Git und nicht mit anderen Versionskontrollsystemen. Wenn Sie das brauchen, dann verwenden Sie bitte ein anderes Werkzeug.gr (git-run) erweitertdie Funktionalität von mr (nur für
git
). Ich finde es einfacher, mehrere Git-Repos mithilfe des Tag-Systems zu organisieren. Der Code fürgr
ist jedoch nicht gut gepflegt. Wenn Sie bash verwenden, stellen Sie sicher, dass Sie es mit demFormular-t tag
anstelle von#tag
verwenden.quelle
Sie können versuchen, Repo mit einer benutzerdefinierten
manifest.xml
Datei zu verwenden, um anzugeben, wo sich Ihre Repositorys befinden. Es gibt einige Dokumentationen dazu.Alternativ könnten Sie verwenden
git-submodule(1
) .quelle
Ich habe ein Tool namens " RepoZ " geschrieben, das automatisch Git-Repositorys erkennt, sobald Sie sie klonen oder etwas daran ändern, wie zum Beispiel das Wechseln eines Zweigs.
Sobald sie gefunden wurden, werden die Repositorys "verfolgt". Das zeigt sie einfach in einer Liste lokaler Repositories, einschließlich einer dichten Statusinformation, die von posh-git inspiriert ist . Dies enthält den aktuellen Zweig und weitere Informationen wie Dateibearbeitungen und die Anzahl der eingehenden oder ausgehenden Commits.
Auf diese Weise behalten Sie den Überblick über Ihre lokalen Repositorys und die noch nicht abgeschlossenen Arbeiten zum Festschreiben oder Pushen. Darüber hinaus können Sie die Repository-Liste als Navigation verwenden, um von einem Repository zu einem anderen zu wechseln.
"Wie kann ich sie alle holen?"
Die Version für Windows bietet ein Kontextmenü zum Abrufen oder Abrufen eines Repositorys. Mit der Mehrfachauswahl können Sie Aktionen für mehrere Repositorys gleichzeitig ausführen.
Möglicherweise ist jedoch eine andere Funktion sehr nützlich:
Mit Auto Fetch können Sie RepoZ anweisen, die Fernbedienungen aller Ihrer Git-Repositorys regelmäßig im Hintergrund abzurufen. Diese Abrufe kollidieren natürlich nicht mit Ihren lokalen Verpflichtungen. Es gibt keine lokalen Zusammenführungsversuche wie mit
git pull
.quelle
gitslave ist ein Tool, das denselben Befehl über viele Repositorys ausführen kann, indem eine Superprojekt / Unterprojekt-Beziehung zwischen dem Super und den Subs erstellt wird. Dies bietet (standardmäßig) eine Zusammenfassung der Ausgabe, sodass Sie sich auf die Repositorys konzentrieren können, die eine eindeutige Ausgabe liefern (nützlich für den Git-Status, nicht so nützlich für Git-ls-Dateien).
Dies wird normalerweise für Projekte verwendet, bei denen Sie mehrere Repositorys zusammenstellen und zur gleichen Zeit im selben Zweig oder Tag oder was auch immer belassen müssen. Für mein Verzeichnis von (nackten) Repositorys habe ich nur ein kleines Makefile, mit dem ich beliebige Git-Befehle ausführen kann, die ich, wie Sie sehen, hauptsächlich für fsck und gc verwende:
quelle
Ich habe einen Alias und eine Funktion erstellt, um einen beliebigen git-Befehl für alle in einem Verzeichnis verfügbaren Repositorys auszuführen (rekursiv). Sie finden es hier: https://github.com/jaguililla/dotfiles/git
Dies ist der Code:
Ich hoffe es hilft :)
quelle
.bash_aliases
:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
. Quelle es, dann zB anrufenrgit status
.Sie können das
git-status-all
Juwel dafür verwenden: https://github.com/reednj/git-status-allEs gibt auch eine Abrufoption, mit der alle Repositorys vom Ursprung abgerufen werden, bevor der Status angezeigt wird:
quelle
find . -name .git -print -execdir git status \;
ist in OrdnungIch verwende dieses Skript, um Git-Befehle in allen meinen Repositorys einfach auszuführen.
Standardmäßig sucht das Skript nach Git-Repositorys in ~ / cm / src. Sie können dies jedoch überschreiben, indem Sie die Umgebungsvariable GITREPO nach Ihren Wünschen einstellen.
Dieses Skript basiert auf diesem Skript .
quelle
find . -name .git -print -execdir git pull \;
macht was du denkst.Ich habe ein Kommandozeilen-Tool namens gita geschrieben , um mehrere Repos zu verwalten. Es zeigt beispielsweise den Status registrierter Repos nebeneinander an
Es kann auch Git-Befehle / Aliase aus jedem Arbeitsverzeichnis delegieren.
Um Ihre Fragen mit diesem Tool zu beantworten:
Der
gita ls
Befehl zeigt 3 mögliche Symbole neben dem Zweignamen an, der angibt+
: inszenierte Änderungen*
: nicht inszenierte Änderungen_
: nicht verfolgte Dateien / OrdnerDie Filialnamen sind auf 5 Arten gefärbt
Um es zu installieren, führen Sie es einfach aus
quelle
Wenn sich noch jemand diesen Thread ansieht, überprüfen Sie bitte mein Shell-Skript namens gitme
Sie müssen Ihre lokalen Git-Repos manuell eingeben, aber ich benutze dieses Tool jeden Tag, um mehrere Git-Projekte auf mehreren Computern zusammenzuarbeiten.
Du kannst rennen
git clone https://github.com/robbenz/gitme.git
Auch das Skript ist unten veröffentlicht
Ich habe also einen Alias in meinem ~ / .bash_profile eingerichtet
alias gitme='sh /path/to/gitme.sh'
quelle
Sie sollten rgit im CPAN auschecken, das rekursiv git-Befehle für alle Repositorys in einem Verzeichnisbaum ausführt.
Aus den Dokumenten:
quelle
Ich habe gerade ein Tool erstellt, das macht, was Sie wollen!
gmaster fetch
gmaster status
gmaster status
Es heißt gitmaster: https://github.com/francoiscabrol/gitmaster
quelle
Ich habe diese einfache Bash-Funktion in mein .bash_profile geschrieben, um git, maven, gradle oder einen anderen bash-Befehl nur in allen git-Repositorys ausführen zu können:
Dies kann auf diese Weise verwendet werden
quelle
Haftungsausschluss: Ich arbeite an diesem Tool unter www.repoflow.com
Ich arbeite daran, aber dies löst auch die OP-Fragen und hilft bei der Verwaltung mehrerer Repositorys im Allgemeinen. Sie können die Benutzeroberfläche oder die zugrunde liegende GraphQL-API verwenden, um Ihre eigenen Skripte zu erstellen. Bitte betrachten Sie dies als eine weitere Option.
quelle
Es gibt ein praktisches Tool zum Abrufen aller mehreren Repositorys.
git-pull-all
ist ein Befehlszeilenprogramm, das asynchron auf mehreren Git-Repositorys ausgeführt werden kann.Installation
Verwendung
Angenommen, Sie haben diese Dateien und Verzeichnisse:
Wenn Sie einen
git-pull-all
Befehl für ein~/Projects
Verzeichnis ausführen , sollte er untergeordnete Git-Repositorys finden (im obigen Fall Cool-Beispiele und Super-Express ) und danngit pull
auf jedem von ihnen ausgeführt werden.GitHub-Link: https://github.com/tatsuyaoiw/git-pull-all
quelle
Ich verwende Visual Studio-Code. Wir haben ungefähr 20 Bibliotheken in unserer Codebasis, die alle separate Git-Repos sind, und die Registerkarte Quellcodeverwaltung in Visual Studio Code ist ziemlich gut, um auf einen Blick zu sehen, wie weit hinter oder vor lokalen Repos liegen. Es gibt auch Einstellungen, die regelmäßig abgerufen werden müssen, um diese Informationen auf dem neuesten Stand zu halten, sowie eine Schaltfläche zum Aktualisieren.
Es ist nicht so praktisch wie ein Skript, aber wenn es um die Quellcodeverwaltung geht, bin ich gerne derjenige, der Änderungen vornimmt. Es ist ein sehr gut geschriebenes Skript erforderlich, um darauf zu achten, dass Änderungen usw. nicht überschrieben werden. Mit dem VS-Code-Ansatz erhalten Sie schnell eine gute Menge an Informationen, die Sie selbst bearbeiten können.
Hier ist ein Screenshot davon, wie es aussieht:
quelle
Ich habe eine großartige Lösung gefunden, um aus allen Unterverzeichnissen mit einem .git-Ordner aus dem aktuellen Zweig zu ziehen, selbst wenn für jedes Repo ein anderer Zweig ausgecheckt ist. Der Befehl ist einzeilig, flexibel genug, um für verschiedene Git-Befehle geändert zu werden, und kann als Alias verwendet werden.
Kopieren Sie einfach Folgendes und fügen Sie es ein:
Brechen sie ab:
Suchen Sie alle Verzeichnisse (-typ d) im aktuellen Verzeichnis (find.) Mit dem Namen ".git" (-name .git) und suchen Sie maximal zwei Verzeichnisse tief (2 statt 1, da wir nach dem suchen Git-Ordner im Git-Repo-Ordner).
Führen Sie den folgenden Shell-Befehl aus (exec sh -c)
Wechseln Sie in das erste Argument (cd $ 0), wechseln Sie das Verzeichnis um eine Ebene nach oben, um den .git-Ordner (cd ..) zu verlassen, und führen Sie dann den Git-Pull-Ursprung aus, während Sie den Zweig angeben, indem Sie git rev-parse ... für den aktuellen Zweig ausführen HEAD Commit.
Das "{}" ist der relative Pfad des Ergebnisses, den wir vom anfänglichen Suchbefehl erhalten . Das ; wird verwendet, um den Befehl zu beenden.
Getestet unter MacOS 10.14.6 unter zsh. Funktioniert nur, wenn entfernte und lokale Zweigstellen den gleichen Namen haben, AFAIK.
Sie können dies ändern, um den Status abzurufen. Ich gehe davon aus, dass Sie möglicherweise Argumente hinzufügen können, um dies flexibler zu gestalten, aber ich habe es noch nicht versucht.
quelle
Ich verwende die Multi-Cursor-Auswahl- / Mehrzeilen-Bearbeitungsfunktion meines Code-Editors (VS-Code), um ein Batch- / Shell-Skript zu erstellen und es auf einmal auszuführen. Mit dieser einfachen, dummen Lösung weiß ich, was ich tue und was ich von der Ausführung dieser Befehle erwarten kann. Kein Raten, kein Lernen, keine Anpassung erforderlich. Ein weiterer Grund ist, dass ich jedes Mal Befehle für verschiedene Repos ausführen möchte, die sich in einem gemeinsamen übergeordneten Verzeichnis befinden.
quelle
https://github.com/wwjamieson3/envisionTools hat ein Bash-Skript namens gitstat, das dies und vieles mehr tut. Es ist GNU- und Mac-kompatibel. Auf Anfrage kann es Abrufe von Fernbedienungen durchführen. Es zeigt nicht verfolgte, geänderte, hinzugefügte, gelöschte und bereitgestellte Dateien. Es unterscheidet sich von Fernbedienungen dadurch, dass nicht zusammengeführte Commits auf Fernbedienungen und nicht gepusste lokale Commits angezeigt werden. Es kann auch farbcodierte Ergebnisse im Zusammenfassungs- oder Detailmodus und sogar in HTML anzeigen. Es verwendet Lokalisieren statt Suchen, da es unendlich schneller ist und sogar dazu auffordert, Ihre Lokalisierungsdatenbank zu aktualisieren, wenn sie zu alt wird.
quelle
Es sieht so aus, als wäre es ziemlich einfach, ein Skript dafür zu schreiben. Im Wesentlichen muss es über die Repositorys iterieren und dann Befehle wie git ls-files, git diff und git log verwenden.
quelle