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

270
drizin

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

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

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

0
Вероятно, лучший подход - это ветвление, фиксация и отправка на * новый удаленный * (который может быть простой папкой git repo / на вашем резервном диске / сервере). Работайте * с * вашим контролем версий, а не вокруг него. Bob 5 лет назад 1

1 ответ на вопрос

1
AberrantWolf

Я сомневаюсь, что есть одна команда для запуска. Вам понадобится комбинация инструментов, работающих последовательно.

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

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

Похожие вопросы