我有一个包含许多 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 可能不够用,但它不太为人所知,所以也许它会很有用。)