96 votes

Exporter uniquement les fichiers modifiés et ajoutés avec la structure de dossiers dans Git

J'aimerais obtenir une liste des fichiers modifiés et ajoutés dans un commit spécifique afin de pouvoir les exporter et générer un package avec la structure de fichier.

L'idée est de récupérer le package et de l'extraire sur le serveur. Pour de nombreuses raisons, je ne parviens pas à créer un point d'ancrage pour extraire automatiquement le référentiel. La meilleure façon de garder le serveur à jour est de générer ce package.

132voto

Aristotle Pagaltzis Points 43253
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT 
  1. $commit_id:

    Prendre un diff de la validation donnée à son parent(s) (y compris tous les sous-répertoires, et pas seulement le répertoire racine).

  2. :

    N'émettent pas de commettre SHA1. Sortie uniquement les noms des fichiers concernés au lieu d'un diff complet.

  3. git diff-tree -r :

    Afficher uniquement les fichiers ajoutés, copiés, modifiés, renommé ou qui ont eu leur type modifié (par exemple. fichier → lien symbolique) dans ce commit. Cette laisse de côté les fichiers supprimés.

70voto

James Ehly Points 321
 git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT  

Pour terminer, voici la commande adressée à tar. Cela exporte les fichiers dans une archive tar.

43voto

MM. Points 722

Voici une ligne de commande qui fonctionne sur Windows 7. Exécuter à partir de votre dépôt de dossier de niveau supérieur.

for /f "usebackq tokens=*" %A in (`git diff-arbre -r --no-commit-id-nom-seulement --diff-filtre=ACMRT TÊTE~1 HEAD`) do echo FA|xcopy "%~fA" "C:\git_changed_files\%A"

  • echo FA réponses de l'inévitable xcopy question de savoir si vous êtes à la copie d'un fichier ou d'un répertoire (dossier), et de l'éventuelle question à propos de l'écrasement d'un fichier (remplacer Tous)
  • usebackq nous permet d'utiliser la sortie de notre commande git comme l'entrée de notre do clause
  • HEAD~1 TÊTE obtient toutes les différences entre la précédente livraison et l'actuel CHEF
  • %~fA transforme la sortie de git dans les chemins d'accès complets (nécessaires pour changer les barres obliques et les barres obliques inverses)
  • C:\git_changed_files\ est là que vous trouverez tous les fichiers qui sont différents

39voto

Nicolas Dermine Points 108

si votre livraison de hachage est par exemple a9359f9, cette commande :

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

pour extraire les fichiers modifiés dans les engager et de les placer dans patch.zip tout en gardant la structure de répertoire du projet intacte.

un peu verbeux, la validation de hachage est mentionné trois fois, mais il semble fonctionner pour moi.

got ici : http://tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/

3voto

Lemon Juice Points 141

J'ai fait un script php pour exporter les fichiers modifiés sur Windows. Si vous avez un localhost serveur de développement avec php set up alors vous pouvez l'exécuter facilement. Il se souviendra de votre dernier dépôt et d'exportation toujours dans le même dossier. Le dossier d'exportation est toujours vidé avant de les exporter. Vous pourrez également voir les fichiers supprimés dans le rouge alors vous savez ce qu'il faut supprimer sur le serveur.

Ce sont juste deux fichiers, donc je les poste ici. Supposons vos dépôts sont situés sous c:/www dans leurs dossiers et que http://localhost aussi points à c:/www et est php. Nous allons mettre ces 2 fichiers dans le 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

Et maintenant charger localhost/git-export/ dans un navigateur. Le script est mis en place pour l'exportation de toujours c:/www/export - changement de tous les chemins en fonction de votre environnement ou de modifier le script pour l'adapter à vos besoins.

Cela fonctionne si vous avez Git installé de sorte que la commande git est dans votre CHEMIN d'accès - ce qui peut être configuré lorsque vous exécutez windows installer Git.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X