Comando Powershell para hacer una copia de seguridad de todos los archivos excepto aquellos que no están modificados en el control de fuente de git

Comando Powershell para hacer una copia de seguridad de todos los archivos excepto aquellos que no están modificados en el control de fuente de git

Tengo una carpeta de trabajo con muchos repositorios GIT y SVN. Dado que todas las revisiones confirmadas están disponibles en el servidor, solo necesito hacer una copia de seguridad de los archivos no versionados (modificados pero no confirmados, no versionados e ignorar los metadatos internos de git/svn).

Supongo que para Windows el mejor enfoque es usar la canalización de Powershell para enumerar todos los archivos, filtrarlos según su estado (ignorar los no modificados) y canalizar esos archivos a 7-zip stdin (o lista intermedia de archivos) para realizar una copia de seguridad.

¿Qué comando debo usar?

Respuesta1

Dudo que haya un solo comando para ejecutar. Necesitará una combinación de herramientas ejecutándose en secuencia aquí.

Git incluye un argumento para enumerar todos los archivos dentro del repositorio:git ls-files

Si desea enumerar solo los archivos modificados y sin seguimiento, puede usar los argumentos -oy -m:

git ls-files -o -m

Si canaliza eso a una función de PowerShell, aparecerá como una matriz y podrá iterar sobre todos esos archivos y hacer lo que quiera con ellos. (No conozco bien SVN, pero presumiblemente debería haber un comando similar allí).

Aquí hay un archivo de script que busca un .gitarchivo en su directorio de trabajo actual, llama git ls-files -o -my canaliza el resultado a otra función que recorre cada archivo e imprime su ruta completa. Podrías copiar o mover o lo que quisieras con cada archivo:

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)

Una vez que sus archivos estén en una ubicación separada, puede ejecutar fácilmente 7-zip en la carpeta, etc.


Dicho esto, parece que lo que quizás quieras es una rama con solo los cambios necesarios que puedas seleccionar encima de cualquier otro conjunto de cambios, o tal vez un alijo que puedas volver a aplicar encima de un conjunto de cambios y luego revertir a voluntad.

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

(Dependiendo de su caso de uso, es posible que el alijo no sea suficiente, pero es menos conocido, por lo que tal vez sea útil).

información relacionada