subir ignorar files eliminar carpetas archivos all git git-diff

files - ignorar archivos git



Exportar solo archivos modificados y agregados con estructura de carpetas en Git (9)

Me gustaría obtener una lista de archivos modificados y agregados en una confirmación específica para que pueda exportarlos y generar un paquete con la estructura de archivos.

La idea es obtener el paquete y extraerlo en el servidor. Por muchas razones, no puedo crear un gancho para tirar automáticamente del repositorio y la forma más fácil que tengo de mantener el servidor actualizado es generando este paquete.


Aquí hay un comando de una línea que funciona en Windows 7. Ejecútelo desde la carpeta de nivel superior de su repositorio.

para / f "usebackq tokens = *"% A in (`git diff-tree -r --no-commit-id --name-only --diff-filter = ACMRT HEAD ~ 1 HEAD`) no hace eco de FA | xcopy "% ~ fA" "C: / git_changed_files /% A"

  • echo FA responde la pregunta inevitable de xcopy sobre si está copiando un archivo o un directorio (archivo) y la posible pregunta sobre sobrescribir un archivo (sobrescribir todo)
  • usebackq nos permite usar la salida de nuestro comando git como entrada a nuestra cláusula do
  • HEAD ~ 1 HEAD obtiene todas las diferencias entre el commit anterior y el HEAD actual
  • % ~ fA transforma la salida de git en rutas totalmente calificadas (necesarias para cambiar las barras diagonales a barras invertidas)
  • C: / git_changed_files / es donde encontrará todos los archivos que son diferentes

Aquí hay un pequeño script bash (Unix) que escribí que copiará los archivos de un hash de confirmación determinado con la estructura de la carpeta:

ARRAY=($(git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $1)) PWD=$(pwd) if [ -d "$2" ]; then for i in "${ARRAY[@]}" do : cp --parents "$PWD/$i" $2 done else echo "Chosen destination folder does not exist." fi

Crea un archivo llamado ''~ / Scripts / copy-commit.sh'' y luego dale privilegios de ejecución:

chmod a+x ~/Scripts/copy-commit.sh

Luego, desde la raíz del repositorio de git:

~/Scripts/copy-commit.sh COMMIT_KEY ~/Existing/Destination/Folder/


He hecho un script php para exportar archivos modificados en Windows. Si tiene un servidor de desarrollo de localhost con la configuración de php, puede ejecutarlo fácilmente. Recordará su último repositorio y exportará siempre a la misma carpeta. La carpeta de exportación siempre se vacía antes de exportar. También verá los archivos eliminados en rojo para que sepa qué eliminar en el servidor.

Estos son solo dos archivos, así que los publicaré aquí. Supongamos que sus repositorios se encuentran en c: / www en sus propias carpetas y que http: // localhost también apunta a c: / www y está habilitado para php. Pongamos estos 2 archivos en c: / www / git-export -

index.php:

<?php /* create directory if doesn''t exist */ function createDir($dirName, $perm = 0777) { $dirs = explode(''/'', $dirName); $dir=''''; foreach ($dirs as $part) { $dir.=$part.''/''; if (!is_dir($dir) && strlen($dir)>0) { mkdir($dir, $perm); } } } /* deletes dir recursevely, be careful! */ function deleteDirRecursive($f) { if (strpos($f, "c:/www/export" . "/") !== 0) { exit("deleteDirRecursive() protection disabled deleting of tree: $f - please edit the path check in source php file!"); } if (is_dir($f)) { foreach(scandir($f) as $item) { if ($item == ''.'' || $item == ''..'') { continue; } deleteDirRecursive($f . "/" . $item); } rmdir($f); } elseif (is_file($f)) { unlink($f); } } $lastRepoDirFile = "last_repo_dir.txt"; $repo = isset($_POST[''repo'']) ? $_POST[''repo''] : null; if (!$repo && is_file($lastRepoDirFile)) { $repo = file_get_contents($lastRepoDirFile); } $range = isset($_POST[''range'']) ? $_POST[''range''] : "HEAD~1 HEAD"; $ini = parse_ini_file("git-export.ini"); $exportDir = $ini[''export_dir'']; ?> <html> <head> <title>Git export changed files</title> </head> <body> <form action="." method="post"> repository: <?=$ini[''base_repo_dir''] ?>/<input type="text" name="repo" value="<?=htmlspecialchars($repo) ?>" size="25"><br/><br/> range: <input type="text" name="range" value="<?=htmlspecialchars($range) ?>" size="100"><br/><br/> target: <strong><?=$exportDir ?></strong><br/><br/> <input type="submit" value="EXPORT!"> </form> <br/> <?php if (!empty($_POST)) { /* ************************************************************** */ file_put_contents($lastRepoDirFile, $repo); $repoDir = $ini[''base_repo_dir''] ."/$repo"; $repoDir = rtrim($repoDir, ''///'); echo "<hr/>source repository: <strong>$repoDir</strong><br/>"; echo "exporting to: <strong>$exportDir</strong><br/><br/>/n"; createDir($exportDir); // empty export dir foreach (scandir($exportDir) as $file) { if ($file != ''..'' && $file != ''.'') { deleteDirRecursive("$exportDir/$file"); } } // execute git diff $cmd = "git --git-dir=$repoDir/.git diff $range --name-only"; exec("$cmd 2>&1", $output, $err); if ($err) { echo "Command error: <br/>"; echo implode("<br/>", array_map(''htmlspecialchars'', $output)); exit; } // $output contains a list of filenames with paths of changed files foreach ($output as $file) { $source = "$repoDir/$file"; if (is_file($source)) { if (strpos($file, ''/'')) { createDir("$exportDir/" .dirname($file)); } copy($source, "$exportDir/$file"); echo "$file<br/>/n"; } else { // deleted file echo "<span style=''color: red''>$file</span><br/>/n"; } } } ?> </body> </html>

git-export.ini:

; path to all your git repositories for convenience - less typing base_repo_dir = c:/www ; if you change it you have to also change it in the php script ; in deleteDirRecursive() function - this is for security export_dir = c:/www/export

Y ahora carga localhost / git-export / en un navegador. La secuencia de comandos está configurada para exportar siempre a c: / www / export - cambie todas las rutas para adaptarlas a su entorno o modifique la secuencia de comandos para adaptarla a sus necesidades.

Esto funcionará si tienes instalado Git para que el comando git esté en tu RUTA: esto se puede configurar cuando ejecutas el instalador de Windows Git.


Necesitaba actualizar mi servidor de prueba y agregar archivos que habían cambiado desde la versión 2.1.
Para mí funcionó una solución similar a la publicada por James Ehly, pero en mi caso quería exportar al paquete de archivo de la diferencia entre dos etiquetas antiguas: tag_ver_2.1 y tag_ver_2.2, no el único commit.

Por ejemplo:

tag_ver_2.1 = 1f72b38ad
tag_ver_2.2 = c1a546782

Aquí hay un ejemplo modificado:

git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar


Para exportar archivos modificados comenzando con una fecha:

diff --stat @{2016-11-01} --diff-filter=ACRMRT --name-only | xargs tar -cf 11.tar

Acceso directo (usar alias)

git exportmdf 2016-11-01 11.tar

Alias ​​en .gitconfig

[alias] exportmdf = "!f() { / git diff --stat @{$1} --diff-filter=ACRMRT --name-only | xargs tar -cf $2; / }; f"


Puede exportar diff usando Tortoise Git a MS Windows:

Hago clic derecho y selecciono TortoiseGit > Mostrar registro y se abrirán los mensajes de registro .

Seleccione dos revisiones y compárela. La diferencia entre estará abierta.

Seleccione los archivos y Exportar selección ... a una carpeta!


si su hash de confirmación es, por ejemplo, a9359f9, este comando:

git archive -o patch.zip a9359f9 $(git diff --name-only a9359f9^..a9359f9)

extraerá los archivos modificados en la confirmación y los colocará en patch.zip mientras mantiene intacta la estructura del directorio del proyecto.

un poco detallado, el commit hash se menciona tres veces, pero parece funcionar para mí.

lo tengo aquí: http://tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/


git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar

Para redondear esto, aquí está el comando canalizado a tar. Esto exporta los archivos a un archivo tar.


git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id

  1. git diff-tree -r $commit_id :

    Tome una diferencia de la confirmación dada a su padre (s) (incluidos todos los subdirectorios, no solo el directorio superior).

  2. --no-commit-id --name-only :

    No envíe la confirmación SHA1. Imprima solo los nombres de los archivos afectados en lugar de una diferencia completa.

  3. --diff-filter=ACMRT :

    Solo muestre archivos agregados, copiados, modificados, renombrados o cuyo tipo haya sido modificado (por ejemplo, archivo → enlace simbólico) en este compromiso. Esto deja fuera los archivos eliminados.