Ich möchte etwas Ähnliches verwenden wie:
git checkout -- <path>/<file>
Ich möchte die Datei jedoch in einen von mir ausgewählten Ordner auschecken, anstatt den lokalen Ordner zu überschreiben <path>/<file>.
Irgendeine Idee?
Ich möchte etwas Ähnliches verwenden wie:
git checkout -- <path>/<file>
Ich möchte die Datei jedoch in einen von mir ausgewählten Ordner auschecken, anstatt den lokalen Ordner zu überschreiben <path>/<file>.
Irgendeine Idee?
Antworten:
Laut Do ein "Git Export" (wie "SVN Export")?
Sie können dafür verwenden git checkout-index, dies ist ein Befehl auf niedriger Ebene. Wenn Sie alles exportieren möchten, können Sie Folgendes verwenden -a:
git checkout-index -a -f --prefix=/destination/path/
So zitieren Sie die Manpages:
Das letzte "/" [auf dem Präfix] ist wichtig. Dem exportierten Namen wird buchstäblich nur die angegebene Zeichenfolge vorangestellt.
Wenn Sie ein bestimmtes Verzeichnis exportieren möchten, sind einige Tricks erforderlich. Der Befehl akzeptiert nur Dateien, keine Verzeichnisse. Um es auf Verzeichnisse anzuwenden, verwenden Sie den Befehl 'find' und leiten Sie die Ausgabe an git weiter.
find dirname -print0 | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
Auch von den Manpages:
Intuitivität ist hier nicht das Ziel. Wiederholbarkeit ist.
GIT_WORK_TREE=../path/to/place git checkout
git worktree(siehe unten) imho ist heute die kanonische Antwort und könnte hier hinzugefügt werden.
Eine andere Lösung, die etwas sauberer ist - geben Sie einfach einen anderen Arbeitsbaum an.
So checken Sie alles von Ihrem HEAD (nicht Index) in ein bestimmtes Out-Verzeichnis aus:
git --work-tree=/path/to/outputdir checkout HEAD -- .
So checken Sie ein Unterverzeichnis oder eine Datei von Ihrem HEAD in ein bestimmtes Verzeichnis aus:
git --work-tree=/path/to/outputdir checkout HEAD -- subdirname
--work-tree=/home/thomasg/okcopynicht --work-tree=~/okcopy(möglicherweise funktioniert auch die Verwendung eines relativen Pfads, während Sie im selben Git-Baum sitzen, aber auf diese Weise liegen Wahnsinn und git statusErgebnisse in R'lyehian)
git statuszeigt dann jedoch viele Mods an (vermutlich, weil der Index jetzt mit dem anderen Verzeichnis und nicht mit dem unberührten normalen Arbeitsbaum übereinstimmt). git resetbrachte es wieder in einen guten Zustand.
git statuszeigt viele Mods und git resethilft nicht. Ich musste git checkout -f HEADden Zustand meines Repos wiederherstellen.
fatal: This operation must be run in a work tree
git resetreicht es aus, den Hauptarbeitsbaum wieder in Ordnung zu bringen. Informationen zum sicheren Exportieren von Repository-Unterverzeichnissen in SHA1, Zweigen oder Tags, ohne den Hauptarbeitsbaum zu ändern, finden Sie in der berüchtigten git archiveLösung von Charles Bailey . Um mehrere Zweige gleichzeitig sicher auszuchecken, ist der neue git worktree addUnterbefehl Ihr Freund.
Für eine einzelne Datei:
git show HEAD:abspath/to/file > file.copy
SHA1 ID, das leicht über gefunden werden kann gitk. Wenn ich diese Datei nur an einen temporären Speicherort "auschecken" muss (dh nicht zurücksetzen muss), würde ich den showUnterbefehl verwenden:git show 82e54378856215ef96c5db1ff1160a741b5dcd70:MyProj/proguard/mapping.txt > myproj_mapping.txt
Die oben genannten Lösungen haben bei mir nicht funktioniert, da ich eine bestimmte getaggte Version des Baums auschecken musste. So cvs exportsoll es übrigens verwendet werden. git checkout-indexnimmt das Tag-Argument nicht an, da es Dateien aus dem Index auscheckt. git checkout <tag>würde den Index unabhängig vom Arbeitsbaum ändern, so dass ich den ursprünglichen Baum zurücksetzen müsste. Die Lösung, die für mich funktioniert hat, war das Klonen des Repositorys. Der gemeinsam genutzte Klon ist recht schnell und benötigt nicht viel zusätzlichen Platz. Das .gitVerzeichnis kann bei Bedarf entfernt werden.
git clone --shared --no-checkout <repository> <destination>
cd <destination>
git checkout <tag>
rm -rf .git
Neuere Versionen von git sollten git clone --branch <tag>das automatische Auschecken des angegebenen Tags unterstützen:
git clone --shared --branch <tag> <repository> <destination>
rm -rf <destination>/.git
git --work-tree=/path/to/outputdir checkout <tag> -- .hat bei dir nicht funktioniert?
Wenn Sie unter Ihrer Funktion arbeiten und nicht zum Master zurückkehren möchten, können Sie Folgendes ausführen:
cd ./myrepo
git worktree add ../myrepo_master master
git worktree remove ../myrepo_master
Es wird ein ../myrepo_masterVerzeichnis mit masterVerzweigungs-Commits erstellt, in dem Sie die Arbeit fortsetzen können
git --work-tree=/path/to/outputdir checkout HEAD -- .nichts, was nichts mit dem Index zu tun hat, kopiert er einfach den ausgewählten Zweig an den angegebenen Speicherort (mit dem Zusatz einer .git-Datei).
myrepo_masterVerzeichnis entfernen
git worktree remove ../myrepo_master
Adrians Antwort warf "fatal: Diese Operation muss in einem Arbeitsbaum ausgeführt werden." Folgendes hat bei uns funktioniert.
git worktree add <new-dir> --no-checkout --detach
cd <new-dir>
git checkout <some-ref> -- <existing-dir>
Anmerkungen:
--no-checkout Checken Sie nichts in den neuen Arbeitsbaum ein.--detach Erstellen Sie keinen neuen Zweig für den neuen Arbeitsbaum.<some-ref>funktioniert mit jedem ref, zum Beispiel mit HEAD~1.git worktree prune.Ergänzung zu @ hasens Antwort . Um die Liste Dateien Kasse , können Sie verwenden , git ls-filesanstatt findwie:
git ls-files -z *.txt | git checkout-index --prefix=/path-to/dest/ -f -z --stdin
-z! Schön, dass Sie ein Skript bereitstellen, das für bestimmte Arten von Injektionsangriffen nicht anfällig ist.
Ich habe einen Git-Alias definiert, um genau dies zu erreichen (bevor ich diese Frage gefunden habe).
Es ist eine kurze Bash-Funktion, die den aktuellen Pfad speichert, zum Git-Repo wechselt, eine Kasse durchführt und dorthin zurückkehrt, wo es begonnen hat.
git checkto ~ / my_project_git entwickeln
Dies würde beispielsweise den Entwicklungszweig in das Verzeichnis "~ / my_project_git" auschecken.
Dies ist der Alias-Code im Inneren ~/.gitconfig:
[alias]
checkTo = "!f(){ [ -z \"$1\" ] && echo \"Need to specify branch.\" && \
exit 1; [ -z \"$2\" ] && echo \"Need to specify target\
dir\" && exit 2; cDir=\"$(pwd)\"; cd \"$2\"; \
git checkout \"$1\"; cd \"$cDir\"; };f"
Ich verwende diesen Alias zum Auschecken eines Zweigs in einem temporären Verzeichnis:
[alias]
cot = "!TEMP=$(mktemp -d); f() { git worktree prune && git worktree add $TEMP $1 && zsh -c \"cd $TEMP; zsh\";}; f" # checkout branch in temporary directory
Verwendung:
git cot mybranch
Sie werden dann in einer neuen Shell im temporären Verzeichnis abgelegt, in der Sie an der Verzweigung arbeiten können. Sie können sogar Git-Befehle in diesem Verzeichnis verwenden.
Wenn Sie fertig sind, löschen Sie das Verzeichnis und führen Sie Folgendes aus:
git worktree prune
Dies erfolgt auch automatisch im Alias, bevor ein neuer Arbeitsbaum hinzugefügt wird.