Команда Powershell для резервного копирования всех файлов, кроме тех, которые не были изменены в системе управления исходным кодом git

Команда Powershell для резервного копирования всех файлов, кроме тех, которые не были изменены в системе управления исходным кодом git

У меня есть рабочая папка с множеством репозиториев GIT и SVN. Поскольку все зафиксированные ревизии доступны на сервере, мне просто нужно сделать резервную копию неверсированных файлов (измененных, но не зафиксированных, не версионированных и игнорирующих внутренние метаданные git/svn).

Я предполагаю, что для Windows наилучшим подходом будет использование конвейера Powershell для вывода списка всех файлов, фильтрации по их статусу (игнорируя немодифицированные) и передачи этих файлов в стандартный ввод 7-zip (или промежуточный список файлов) для резервного копирования.

Какую команду мне следует использовать?

решение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

(В зависимости от вашего варианта использования stash может оказаться не совсем достаточным, но он менее известен, поэтому, возможно, будет полезен.)

Связанный контент