Comando Powershell para fazer backup de todos os arquivos, exceto aqueles que não foram modificados no controle de origem git

Comando Powershell para fazer backup de todos os arquivos, exceto aqueles que não foram modificados no controle de origem git

Tenho uma pasta de trabalho com muitos repositórios GIT e SVN. Como as revisões confirmadas estão todas disponíveis no servidor, eu só preciso fazer backup dos arquivos não versionados (modificados, mas não confirmados, não versionados e ignorar os metadados internos do git/svn).

Presumo que para o Windows a melhor abordagem seja usar o pipeline do Powershell para listar todos os arquivos, filtrar de acordo com seu status (ignore os não modificados) e canalizar esses arquivos para o 7-zip stdin (ou lista intermediária de arquivos) para backup.

Qual comando devo usar?

Responder1

Duvido que haja um único comando para executar. Você precisará de uma combinação de ferramentas executadas em sequência aqui.

O Git inclui um argumento para listar todos os arquivos dentro do repositório:git ls-files

Se quiser listar apenas os arquivos não rastreados e modificados, você pode usar os argumentos -oe :-m

git ls-files -o -m

Se você canalizar isso para uma função do PowerShell, ele virá como uma matriz e você poderá iterar todos esses arquivos e fazer o que quiser com eles. (Não conheço bem o SVN, mas provavelmente deveria haver um comando semelhante lá.)

Aqui está um arquivo de script que procura um .gitarquivo em seu diretório de trabalho atual, chama git ls-files -o -me direciona a saída para outra função que passa por cada arquivo e imprime seu caminho completo. Você pode copiar ou mover ou o que quiser com cada arquivo:

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)

Quando seus arquivos estiverem em um local separado, você poderá facilmente executar o 7-zip na pasta, etc.


Dito isto, parece que o que você pode querer é um branch com apenas as alterações necessárias que você pode escolher sobre qualquer outro conjunto de alterações, ou talvez um stash que você possa reaplicar sobre um conjunto de alterações e depois reverter à vontade.

https://git-scm.com/docs/git-stash

(Dependendo do seu caso de uso, o stash pode não ser suficiente, mas é menos conhecido, então talvez seja útil.)

informação relacionada