Exporter seulement les fichiers modifiés et ajoutés avec la structure de dossier dans Git

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

l'idée est de récupérer le paquet et de l'extraire sur le serveur. Pour de nombreuses raisons, je ne peux pas créer un crochet pour tirer la mise à jour automatiquement et la façon la plus simple de garder le serveur à jour est de générer ce paquet.

62
demandé sur random 2010-12-27 22:41:34

11 réponses

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

    prend une diff de la propagation donnée à son(ses) parent (s) (y compris tous les sous-répertoires, pas seulement le répertoire supérieur).

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

    ne pas afficher la commande sha1. Affiche seulement les noms des fichiers affectés au lieu d'une diff complète.

  3. --diff-filter=ACMRT :

    N'afficher que les fichiers ajoutés, copiés, modifiés, renommés ou dont le type a été modifié (par ex. fichier → lien symbolique)dans cette propagation. Cela exclut les fichiers supprimés.

81
répondu Aristotle Pagaltzis 2012-04-18 07:25:20
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar

juste pour compléter ça, voici la commande pipée à tar. Ceci exporte les fichiers dans une archive tar.

65
répondu James Ehly 2011-09-24 05:01:30

Voici une commande d'une ligne qui fonctionne sur Windows 7. Exécutez-le à partir du dossier de premier niveau de votre dépôt.

for / f "usebackq tokens=*" %a in (`git diff-tree-r --no-commit-id --name-only --diff-filter=ACMRT HEAD~1 HEAD`) do echo FA / xcopy "%~fA" "C:\git_changed_files\%A "

  • echo FA répond à l'inévitable question de xcopie à savoir si vous copiez un fichier ou un répertoire (fichier), 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 entrée à notre clause do
  • HEAD~1 TÊTE obtient toutes les différences entre la précédente livraison et l'actuel CHEF
  • % ~fA les barres obliques inverses)
  • C:\git_changed_files\ est où vous trouverez tous les fichiers qui sont différents
37
répondu MM. 2012-04-22 20:57:28

si votre hash de propagation est par exemple a9359f9, cette commande:

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

extraira les fichiers modifiés dans la propagation et les placera dans patch.zip tout en gardant la structure du répertoire de projet intacte.

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

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

26
répondu Nicolas Dermine 2013-12-19 15:56:40

vous pouvez exporter diff en utilisant Tortoise Git vers MS Windows:

je clic droit et sélectionner TortoiseGit > afficher le journal et les messages de journal seront ouverts.

Sélectionnez deux révisions et comparez-les. la différence entre sera ouverte.

sélectionner les fichiers et exporter la sélection ... pour un dossier!

enter image description here

12
répondu Wendel 2016-10-29 16:32:14

j'avais besoin de mettre à jour mon serveur de test et d'ajouter des fichiers qui ont changé depuis la version 2.1.

Pour moi a travaillé solution similaire à James Ehly posté, mais dans mon cas je voulais Exporter pour archiver paquet de différence entre deux tags plus anciens - tag_ver_2.1 et tag_ver_2.2 pas le seul commit.

Par exemple:



tag_ver_2.1 = 1f72b38ad

tag_ver_2.2 = c1a546782



Voici un exemple modifié:

git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar
7
répondu pietr 2015-02-13 14:44:29

j'ai créé un script php pour exporter les fichiers modifiés sur Windows. Si vous avez un serveur de développement localhost avec php configuré, vous pouvez l'exécuter facilement. Il se souviendra de votre dernier dépôt et exportera toujours vers le même dossier. Le dossier d'exportation est toujours vidé avant l'exportation. Vous verrez aussi les fichiers supprimés en rouge pour savoir quoi supprimer sur le serveur.

ce ne sont que deux fichiers donc je vais les poster ici. Supposons vos dépôts sont situés sous c:/www dans leurs propres dossiers et que http://localhost indique également c:/www and is php-enabled. Mettons ces 2 fichiers dans c:/www/git-export -

de l'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 configuré pour exporter toujours vers c:/www/export -changer tous les chemins pour s'adapter à votre environnement ou modifier le script pour s'adapter à votre besoin.

cela fonctionnera si vous avez installé Git de sorte que la commande git soit dans votre chemin - cela peut être configuré lorsque vous exécutez l'installateur windows Git.

2
répondu Lemon Juice 2011-01-06 02:38:04

pour exporter des fichiers modifiés commençant par une date:

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

raccourci (utiliser alias)

  git exportmdf 2016-11-01 11.tar

Alias in .gitconfig

  [alias]
  exportmdf = "!f() { \
    git diff --stat @{} --diff-filter=ACRMRT --name-only | xargs tar -cf ; \
  }; f"
1
répondu catalinp 2016-11-28 14:01:46

voici un petit script bash (Unix) que j'ai écrit qui va copier des fichiers pour un hash de propagation donné avec la structure du dossier:

ARRAY=($(git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT ))
PWD=$(pwd)

if [ -d "" ]; then

    for i in "${ARRAY[@]}"
    do
        : 
        cp --parents "$PWD/$i" 
    done
else
    echo "Chosen destination folder does not exist."
fi

créer un fichier nommé '~/Scripts/copy-commit.sh "alors donnez-lui les privilèges d'exécution:

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

puis, à partir de la racine du dépôt git:

~/Scripts/copy-commit.sh COMMIT_KEY ~/Existing/Destination/Folder/
0
répondu Patrick.SE 2018-02-23 21:53:43

les commandes ci-dessous ont fonctionné pour moi.

si vous voulez que la différence des fichiers soit changée par la dernière propagation:

git archive -o update.zip HEAD $(git diff --name-only HEAD^)

ou si vous voulez une différence entre deux commits spécifiques:

git archive -o update.zip 4d50f1ee78bf3ab4dd8e66a1e230a64b62c49d42 $(git diff --name-only 07a698fa9e5af8d730a8c33e5b5e8eada5e0f400)

ou si vous avez des fichiers non engagés, souvenez-vous que git way est de tout propager, les branches sont bon marché:

git stash
git checkout -b feature/new-feature
git stash apply
git add --all
git commit -m 'commit message here'
git archive -o update.zip HEAD $(git diff --name-only HEAD^)
0
répondu Ashutosh Tripathy 2018-09-24 12:45:18

j'ai également fait face à un problème similaire avant. J'ai écrit un petit script Shell.

$git log --reverse commit_HashX^..commit_HashY --pretty=format:'%h'

la commande ci-dessus affichera le hachage de propagation(révision) de la commande commit_HashX à la commande commit_HashY dans l'ordre inverse.

 456d517 (second_hash)
 9362d03
 5362d03
 226x47a
 478bf6b (six_hash)

maintenant le Script Shell principal en utilisant la commande ci-dessus.

commitHashList=$(git log --reverse ^.. --pretty=format:'%h')
for hash in $commitHashList
do
    echo "$hash"
    git archive -o \Path_Where_you_want_store\ChangesMade.zip $hash
done

ajouter ce code à export_changes.sh. Maintenant, passez le fichier et propagez les hachures au script.

assurez-vous cette propagation initiale doit être le premier argument puis la dernière propagation à laquelle vous voulez exporter des modifications.

exemple:

$sh export_changes.sh hashX hashY

mettez ce script dans Git local directory ou mettez Git local directory path dans le script. J'espère que ça aidera..!

0
répondu Raj Hawaldar 2018-10-04 16:01:52