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
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).
--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.
--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.