90

特定のコミットで変更および追加されたファイルのリストを取得して、それらをエクスポートしてファイル構造のパッケージを生成できるようにしたいと考えています。

アイデアは、パッケージを取得してサーバー上で抽出することです。多くの理由で、レポを自動的にプルするためのフックを作成できません。サーバーを最新の状態に保つ最も簡単な方法は、このパッケージを生成することです。

4

13 に答える 13

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

    指定されたコミットとその親 (トップ ディレクトリだけでなく、すべてのサブディレクトリを含む) との差分を取ります。

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

    コミット SHA1 を出力しません。完全な差分ではなく、影響を受けるファイルの名前のみを出力します。

  3. --diff-filter=ACMRT:

    このコミットで、追加、コピー、変更、名前変更、またはタイプが変更されたファイル (例: ファイル → シンボリックリンク) のみを表示します。これにより、削除されたファイルが除外されます。


コメントからの更新:
質問のコンテキストと以下のコメントに基づいて、次のコマンドを使用して、ファイルをフォルダー構造 のACMRTファイルとして取得できます。.tar

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | tar -czf file.tgz -T -
于 2010-12-27T21:06:03.627 に答える
70
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar

これを締めくくるために、tar にパイプされたコマンドを次に示します。これにより、ファイルが tar アーカイブにエクスポートされます。

于 2011-09-24T05:01:30.070 に答える
41

Windows 7 で動作する 1 行のコマンドを次に示します。リポジトリの最上位フォルダーから実行します。

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は、ファイルまたはディレクトリ (ファイル) をコピーしているかどうかに関する xcopy の避けられない質問と、ファイルの上書き (すべてを上書き) に関する可能性のある質問に答えます。
  • usebackqを使用すると、git コマンドからの出力を do 句への入力として使用できます。
  • HEAD~1 HEADは、前のコミットと現在の HEAD の間のすべての相違点を取得します
  • %~fAは git 出力を完全修飾パスに変換します (スラッシュをバックスラッシュに変更する必要があります)
  • C:\git_changed_files\は、異なるすべてのファイルを見つける場所です
于 2012-04-22T20:57:28.817 に答える
37

コミット ハッシュがたとえば a9359f9 の場合、このコマンドは次のようになります。

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

コミットで変更されたファイルを抽出し、プロジェクトのディレクトリ構造をそのまま維持しながら、それらを patch.zip に配置します。

少し冗長ですが、コミットハッシュは3回言及されていますが、私にはうまくいくようです.

ここで入手しました:http://tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/

于 2013-12-19T15:56:40.547 に答える
31

Tortoise Gitを使用して差分を MS Windows にエクスポートできます。

右クリックして [ TortoiseGit ] > [ Show Log ] を選択すると、[Log Messages]が開きます。

2 つのリビジョンを選択して比較します。差は開きます。

ファイルを選択し、選択内容を ...フォルダーにエクスポートします。

ここに画像の説明を入力

于 2016-10-29T16:32:14.327 に答える
2

Windowsで変更されたファイルをエクスポートするためのphpスクリプトを作成しました。PHP がセットアップされた localhost 開発サーバーがある場合は、簡単に実行できます。最後のリポジトリを記憶し、常に同じフォルダーにエクスポートします。エクスポート フォルダは、エクスポートする前に常に空になります。削除されたファイルも赤で表示されるので、サーバーで何を削除するかがわかります。

これらはたった2つのファイルなので、ここに投稿します。リポジトリが独自のフォルダーの c:/www の下にあり、http://localhostも c:/www を指しており、php が有効になっているとします。これらの 2 つのファイルを 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

そして、ブラウザに localhost/git-export/ をロードします。スクリプトは、常に c:/www/export にエクスポートするように設定されています。環境に合わせてすべてのパスを変更するか、ニーズに合わせてスクリプトを変更してください。

これは、git コマンドが PATH にあるように Git がインストールされている場合に機能します。これは、Windows Git インストーラーを実行するときに構成できます。

于 2011-01-06T02:38:04.127 に答える