Powershell-Befehl zum Sichern aller Dateien außer denen, die in der Git-Quellcodeverwaltung unverändert sind

Powershell-Befehl zum Sichern aller Dateien außer denen, die in der Git-Quellcodeverwaltung unverändert sind

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 nicht versionierten 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 darin besteht, mithilfe einer Powershell-Pipeline alle Dateien aufzulisten, sie nach ihrem Status herauszufiltern (die unveränderten Dateien ignorieren) und diese Dateien zur Sicherung in die 7-Zip-Standardeingabe (oder eine Zwischenliste von Dateien) umzuleiten.

Welchen Befehl soll ich verwenden?

Antwort1

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

Git enthält ein Argument zum Auflisten aller Dateien im Repository:git ls-files

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

git ls-files -o -m

Wenn Sie das in eine PowerShell-Funktion weiterleiten, wird es als Array empfangen und Sie können alle diese Dateien durchlaufen und mit ihnen machen, was Sie wollen. (Ich kenne mich mit SVN nicht so gut aus, aber vermutlich sollte es dort einen ähnlichen Befehl geben.)

Hier ist eine Skriptdatei, die .gitin Ihrem aktuellen Arbeitsverzeichnis nach einer Datei sucht, aufruft git ls-files -o -mund die Ausgabe an eine andere Funktion weiterleitet, die jede Datei durchgeht und ihren vollständigen Pfad ausgibt. Sie können jede Datei kopieren, 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)

Sobald sich Ihre Dateien an einem separaten Ort befinden, können Sie problemlos 7-Zip auf dem Ordner ausführen usw.


Das heißt, es klingt, als ob Sie stattdessen entweder einen Zweig mit nur den erforderlichen Änderungen möchten, den Sie auf jedem anderen Änderungssatz auswählen können, oder vielleicht einen Stash, den Sie erneut auf einem Änderungssatz anwenden und dann nach Belieben rückgängig machen können.

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

(Je nach Anwendungsfall reicht Stash möglicherweise nicht ganz aus, ist aber weniger bekannt und daher vielleicht nützlich.)

verwandte Informationen