Git ソース管理で変更されていないファイルを除くすべてのファイルをバックアップする Powershell コマンド

Git ソース管理で変更されていないファイルを除くすべてのファイルをバックアップする Powershell コマンド

多数の GIT および SVN リポジトリを含む作業フォルダーがあります。コミットされたリビジョンはすべてサーバーで利用できるため、バージョン管理されていないファイル (変更されているがコミットされておらず、バージョン管理されておらず、内部の git/svn メタデータを無視する) をバックアップするだけで済みます。

Windows の場合、Powershell パイプラインを使用してすべてのファイルを一覧表示し、そのステータスに応じてフィルター処理し (変更されていないファイルは無視)、それらのファイルを 7-zip stdin (または中間ファイル リスト) にパイプしてバックアップするのが最善の方法だと思います。

どのコマンドを使用すればよいですか?

答え1

実行するコマンドが 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 を簡単に実行できます。


そうは言っても、代わりに必要なのは、他の変更セットの上にチェリーピックできる必要な変更だけを含むブランチ、または変更セットの上に再適用して自由に元に戻すことができるスタッシュのいずれかであると思われます。

git stash は、git のリポジトリに含まれています。

(使用例によっては、stash だけでは十分ではないかもしれませんが、あまり知られていないため、役に立つかもしれません。)

関連情報