Ich habe ein nacktes CENTRAL-Repository, in dem drei Entwickler-Repositorys normal abgerufen und verschoben werden.
Ich habe auch zwei andere Repositorys, die vom CENTRAL Bare Repo abgerufen werden: eines ist der Live-Server und das andere ist ein Test- / Stage-Server - jedes wird von seinem jeweiligen Zweig abgerufen.
Das Szenario ist das folgende: Ich habe ein post-update
Hook-Skript im CENTRAL-Repo, das automatisch auf die Test- und Live-Repos zugreift und für jedes einen Pull-Befehl ausführt. Dadurch werden sowohl Test- als auch Live-Server aktualisiert, je nachdem, welcher Zweig neue Commits hat. Das alles funktioniert super.
Das Problem ist folgendes: Es kann vorkommen, dass im Notfall Dateien direkt auf dem Server aktualisiert werden (über FTP oder was auch immer) und das CENTRAL-Skript nach dem Update fehlschlägt, da Konflikte beim Zusammenführen / Überschreiben auftreten. Es gibt keine Möglichkeit, dieses Szenario zu vermeiden, und es ist unvermeidlich.
Was ich gerne hätte, ist Folgendes: Ich möchte, dass der Pull von den Live- und Test-Sites beim Pull immer überschrieben / zusammengeführt wird. Immer. Diese Repos sind nur zum Ziehen bestimmt, da sie nicht für die Entwicklung bestimmt sind.
Bei all meinen Nachforschungen kann ich keine gute Lösung finden, bei der ein Pull immer ein Überschreiben der lokalen Dateien erzwingt. Ist das überhaupt möglich? Wenn ja, wäre dies ein großartiges Entwicklungsszenario.
Antworten:
Wirklich der ideale Weg, dies zu tun, ist überhaupt nicht zu verwenden
pull
, sondernfetch
undreset
:(Wechseln
master
zu dem Zweig, dem Sie folgen möchten.)pull
dient dazu, Änderungen auf irgendeine Weise zusammenzuführen, währendreset
Ihre lokale Kopie einfach mit einem bestimmten Commit übereinstimmt.clean
Je nach den Anforderungen Ihres Systems möchten Sie möglicherweise etwas andere Optionen in Betracht ziehen .quelle
reset --hard
ist ein Befehl, mit dem der Status des Arbeitsverzeichnisses (und des aktuellen Zweigs) in einen Status versetzt wird, der dem eines bestimmten Commits entspricht.FETCH_HEAD
ist eine Referenz, die automatisch erstellt wirdfetch
, um die abgerufene Referenz darzustellen. Es wird nicht zusammengeführt, sondern bei jedem Abruf direkt überschrieben.clean
ist ein Befehl, der Dateien entfernt, die nicht von verfolgt werdengit
. Die-df
Flags weisen ihn an, Verzeichnisse zu entfernen (-d
) und das Entfernen tatsächlich durchzuführen (-f
).git clean -dn
vor der Verwendung verwenden,git clean -df
damit Sie sehen, welche Dateien / Ordner gelöscht werden.git clean -df
kann nur rückgängig gemacht werden, wenn Sie ein Backup hattengit clean -df
, dass auch gitignored Dateien entfernt werden, aber es stellt sich heraus, dass dies nicht der Fall ist.git clean --help
sagt: "Normalerweise werden nur Dateien entfernt, die Git nicht bekannt sind. Wenn jedoch die Option -x angegeben ist, werden auch ignorierte Dateien entfernt. Dies kann beispielsweise nützlich sein, um alle Build-Produkte zu entfernen."Sie könnten dies versuchen:
(von Wie erzwinge ich "git pull", um lokale Dateien zu überschreiben? )
Eine andere Idee wäre, den gesamten Git zu löschen und einen neuen Klon zu erstellen.
quelle
Ich bin nicht sicher, wie ich es in einem Befehl machen soll, aber Sie könnten etwas tun wie:
oder auch
quelle
git reset --hard && git pull
. Alternativ, aber nicht bessergit reset --hard; git pull
. Mit&&
wird der zweite Befehl nur ausgeführt, wenn der erste Befehl erfolgreich war.;
führt es unabhängig vom Exit-Code des ersten Befehls aus.Um eine Kopie des Zweigs abzurufen und das Überschreiben lokaler Dateien vom Ursprung zu erzwingen, verwenden Sie:
Alle aktuellen Arbeiten gehen verloren und sind dann mit dem Ursprungszweig identisch
quelle
quelle
Sie können den Haken ändern, um alles sauber zu wischen.
quelle
git clean
ist bereits "Nicht verfolgte Dateien aus dem Arbeitsbaum entfernen" (oben auf der Seite). Normalerweise enthält dies keine ignorierten Dateien,-x
weist jedoch darauf hingit clean
, dass auch ignorierte Dateien eingeschlossen werden sollen (außer dies wirkt sich nicht auf Dateien aus, die von der-e
Option ignoriert werden ).Wenn Sie die lokalen Änderungen seit dem letzten Pull / Clone noch nicht festgeschrieben haben, können Sie Folgendes verwenden:
checkout
pull
löscht Ihre lokalen Änderungen mit dem letzten lokalen Commit und sinkronisiert sie in das Remote-Repositoryquelle