![Powershell指令備份git原始碼管理中未修改的檔案以外的所有文件](https://rvso.com/image/1567496/Powershell%E6%8C%87%E4%BB%A4%E5%82%99%E4%BB%BDgit%E5%8E%9F%E5%A7%8B%E7%A2%BC%E7%AE%A1%E7%90%86%E4%B8%AD%E6%9C%AA%E4%BF%AE%E6%94%B9%E7%9A%84%E6%AA%94%E6%A1%88%E4%BB%A5%E5%A4%96%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6.png)
我有一個包含許多 GIT 和 SVN 儲存庫的工作資料夾。由於提交的修訂在伺服器中都可用,因此我只需要備份未版本化的檔案(已修改但未提交,未版本化,並忽略內部 git/svn 元資料)。
我認為對於Windows,最好的方法是使用Powershell 管道列出所有文件,根據其狀態進行過濾(忽略未修改的文件),並將這些文件通過管道傳輸到7-zip stdin(或中間文件列表)中進行備份。
我應該使用哪個命令?
答案1
我懷疑是否有一個命令可以運行。您將需要在這裡按順序運行的工具組合。
Git 包含一個參數來列出儲存庫中的所有檔案: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
(根據您的用例,存儲可能還不夠,但它不太為人所知,所以也許它會很有用。)