Powershell-Befehl zum Sichern aller Dateien mit Ausnahme der Dateien, die in git Source Control nicht geändert wurden

399
drizin

Ich habe einen Arbeitsordner mit vielen GIT- und SVN-Repositorys. Da die festgeschriebenen Revisionen alle auf dem Server verfügbar sind, muss ich nur die unversionierten Dateien sichern (geändert, aber nicht festgeschrieben, nicht versioniert und die internen git / svn-Metadaten ignorieren).

Ich gehe davon aus, dass der beste Ansatz für Windows die Verwendung der Powershell-Pipeline ist, um alle Dateien aufzulisten, nach ihrem Status herauszufiltern (ignorieren Sie die nicht geänderten) und leiten Sie diese Dateien zur Sicherung in 7-zip stdin (oder eine Zwischenliste der Dateien).

Welchen Befehl soll ich verwenden?

0
Der beste Ansatz ist wahrscheinlich das Verzweigen, Festschreiben und Wechseln zu * einer neuen Remote-Adresse (die ein einfacher Git-Repo-Ordner auf Ihrem Backup-Laufwerk / -Server sein kann). Arbeite * mit * deiner Versionskontrolle, nicht um sie herum. Bob vor 5 Jahren 1

1 Antwort auf die Frage

1
AberrantWolf

Ich bezweifle, dass ein einzelner Befehl ausgeführt werden muss. Sie benötigen hier eine Kombination von Werkzeugen, die nacheinander ausgeführt werden.

Git enthält ein Argument, um alle Dateien im Repo aufzulisten: git ls-files

Wenn Sie nur die nicht protokollierten und geänderten Dateien auflisten möchten, können Sie die Argumente -ound verwenden -m:

git ls-files -o -m 

Wenn Sie dies in eine PowerShell-Funktion pipeln, wird diese als Array angezeigt, und Sie können alle diese Dateien durchlaufen und mit ihnen machen, was Sie möchten. (Ich kenne SVN nicht gut, aber vermutlich sollte es dort einen ähnlichen Befehl geben.)

Hier ist eine Skriptdatei, die nach einer .gitDatei in Ihrem aktuellen Arbeitsverzeichnis sucht, Aufrufe git ls-files -o -mund Pipes ausgibt, die an eine andere Funktion ausgegeben werden, die jede Datei durchläuft und ihren vollständigen Pfad ausgibt. Sie können mit jeder Datei kopieren oder verschieben oder was auch immer Sie möchten:

function DoSomethingForGitLsFiles { param( [array]$FileList ) Write-Host $FileList.count 'files found:' foreach ($FilePath in $FileList) { # This is where you could copy your files out somewhere else. Write-Host "FILE: $(Get-Location)\$FilePath" } }  function FindGitRepo { param( [string]$searchPath )  if (Get-ChildItem -Name -Path "$searchPath\*.git") { DoSomethingForGitLsFiles (git ls-files -o -m) } else { Write-Host "No .git repo found." } }  FindGitRepo -SearchPath (Get-Location) 

Wenn sich Ihre Dateien an einem anderen Ort befinden, können Sie 7-zip für den Ordner usw. problemlos ausführen.


Das heißt, es klingt wie das, was Sie stattdessen möchten, entweder ein Zweig mit nur den erforderlichen Änderungen, die Sie auf einem anderen Changeset auswählen könnten, oder vielleicht ein Versteck, den Sie auf einem Changeset erneut anwenden und dann nach Belieben wiederherstellen können.

https://git-scm.com/docs/git-stash

(Abhängig von Ihrem Anwendungsfall reicht Stash möglicherweise nicht aus, aber es ist weniger bekannt, daher ist es möglicherweise nützlich.)