Powershell 命令备份 git 源代码管理中未修改的文件以外的所有文件

Powershell 命令备份 git 源代码管理中未修改的文件以外的所有文件

我有一个包含许多 GIT 和 SVN 存储库的工作文件夹。由于已提交的修订版本都在服务器中,因此我只需备份未版本控制的文件(已修改但未提交、未版本控制,并忽略内部 git/svn 元数据)。

我认为对于 Windows 来说,最好的方法是使用 Powershell 管道列出所有文件,根据其状态进行过滤(忽略未修改的文件),然后将这些文件导入 7-zip stdin(或中间文件列表)进行备份。

我应该使用哪个命令?

答案1

我怀疑是否有一个命令可以运行。您需要按顺序运行多个工具组合。

Git 包含一个参数来列出 repo 内的所有文件:git ls-files

如果只想列出未跟踪和修改的文件,可以使用-o-m参数:

git ls-files -o -m

如果将其导入到 PowerShell 函数中,它将以数组的形式出现,您可以遍历所有这些文件并对它们执行任何您想做的事情。(我不太了解 SVN,但大概那里应该有类似的命令。)

.git这是一个脚本文件,它在当前工作目录中查找文件,调用git ls-files -o -m,并将输出传递给另一个函数,该函数遍历每个文件并打印其完整路径。您可以对每个文件进行复制、移动或任何您想要的操作:

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)

一旦您的文件位于单独的位置,您可以轻松地在文件夹上运行 7-zip 等......


话虽如此,听起来您可能想要的是一个仅包含所需更改的分支,您可以在任何其他变更集之上进行挑选,或者可能是一个可以在变更集之上重新应用然后随意恢复的存储。

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

(根据您的使用情况,stash 可能不够用,但它不太为人所知,所以也许它会很有用。)

相关内容