Создайте архив для разницы между двумя тегами с git [duplicate]

Для меня самым простым решением будет сохранение значения, когда счетчик равен максимальному. Поэтому достаточно одной строки:

df[df['count'] == df.groupby(['Mt'])['count'].transform(max)]
62
задан random 13 August 2012 в 02:40
поделиться

11 ответов

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id
  1. git diff-tree -r $commit_id: Возьмите diff данной фиксации своему родительскому элементу (включая все подкаталоги, а не только верхнюю директорию).
  2. --no-commit-id --name-only: Do не выводить commit SHA1. Вывести только имена затронутых файлов, а не полный diff.
  3. --diff-filter=ACMRT: показывать только файлы, добавленные, скопированные, измененные, переименованные файлы или изменения их типа (например, файл → symlink) в этом совершить. Это исключает удаленные файлы.
79
ответ дан Jess Telford 22 August 2018 в 20:27
поделиться
  • 1
    Теперь мне просто нужно найти способ сгладить результат этой команды с помощью tar! Спасибо! – Michael Kuhinica 4 January 2011 в 22:58
  • 2
    @Taverneiro Вы можете передать его команде tar, указанной в этом ответе , например. для файла tgz: git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | tar -czf file.tgz -T - – Matthieu Sadouni 19 December 2014 в 11:09
1
ответ дан catalinp 22 August 2018 в 20:27
поделиться
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar

Чтобы обойти это, вот команда, переданная по типу. Это экспортирует файлы в архив tar.

65
ответ дан James Ehly 22 August 2018 в 20:27
поделиться
  • 1
    это потрясающе! – LeandroCR 29 October 2013 в 21:59
  • 2
    Это можно сделать для нескольких коммитов в один файл tar? – evolutionxbox 14 August 2014 в 14:54
  • 3
    При попытке добавить несколько коммитов в один и тот же файл tar иногда tar снова создает filename.ext с другим именем (filename1.ext). Я понимаю, что если я использую zip, я могу добавить и перезаписать файл, если он существует в zip ... Вам просто нужно заменить xargs на xargs zip -r0 myzipfile.zip $ 1 – Ricardo Martins 23 September 2014 в 18:39
  • 4
    Здесь нужны xargs? Я знаю, что это для таких вещей, как rm, но я думал, что tar может обрабатывать столько файлов, сколько захотите. – Erdal G. 7 June 2016 в 08:18
  • 5
    Будьте осторожны с этим ответом, это возьмет файлы diff, но как текущую версию текущей ветви – mems 20 March 2018 в 17:15

Я сделал php-скрипт для экспорта измененных файлов в Windows. Если у вас есть сервер разработки localhost с настройкой php, вы можете легко запустить его. Он будет помнить ваш последний репозиторий и всегда экспортировать его в одну и ту же папку. Перед экспортом папка экспорта всегда очищается. Вы также увидите удаленные файлы в красном цвете, чтобы знать, что нужно удалить на сервере.

Это всего лишь два файла, поэтому я отправлю их здесь. Предположим, что ваши репозитории расположены в каталоге 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 так, чтобы git в вашем PATH - это можно настроить при запуске установщика Windows Git.

2
ответ дан Lemon Juice 22 August 2018 в 20:27
поделиться
  • 1
    этот код отличный, но я хочу экспортировать файлы и каталоги с подмодулями, ваш код работал только с основным репозиторием, и если подмодули сменили ваш код, скажите, что папка подмодулей удалена! – morteza khadem 12 October 2017 в 10:42

Вот однострочная команда, работающая в Windows 7. Запустите ее из папки верхнего уровня вашего репозитория.

для / f "usebackq tokens = *"% A в (` git diff-tree -r -no-commit-id -name -diff-filter = ACMRT HEAD ~ 1 HEAD`) сделать эхо FA | xcopy "% ~ fA" "C: \ git_changed_files \% A"

  • echo FA отвечает на неизбежный xcopy вопрос о том, копируете ли вы файл или каталог (файл), и о возможном вопросе о перезаписывании файла (перезаписывать все)
  • usebackq позволяет нам использовать вывод из нашей команды git в качестве входного сигнала для нашего предложения do
  • HEAD ~ 1 HEAD получает все различия между предыдущей фиксацией и текущим HEAD
  • % ~ fA преобразует git-выход в полностью определенные пути (необходимые для смены косой черты на обратную косую черту)
  • C: \ git_changed_files \ где вы найдете все файлы, которые отличаются
37
ответ дан MM. 22 August 2018 в 20:27
поделиться
  • 1
    Когда я увидел этот беспорядок символов, я не ожидал, что он будет работать без обширной настройки ... но это сработало с первой попытки, спасибо. – Nathan Fig 27 March 2014 в 22:33
  • 2
    Это потрясающе, как шарм! – Ahmad Alfy 19 October 2015 в 15:43
  • 3
    немного хэдз-ап для всех парней, которые (как я), не очень знакомы с пакетными файлами Windows: если вы хотите использовать приведенную выше команду в пакетном файле, вам нужно будет заменить% A на %% A внутри цикла for – buddybubble 17 November 2015 в 10:20
  • 4
    Какие? ЛОЛ. Просто используйте git archive - git diff комбо (ответ Николя). Гораздо проще и понятнее. (Честно говоря, я не знаю, что здесь происходит.) – ADTC 23 November 2015 в 04:01

, если хеш фиксации, например, a9359f9, эта команда:

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

будет извлекать файлы, измененные в фиксации, и размещать их в файле patch.zip, сохраняя при этом

бит многословный, хеш фиксации упоминается три раза, но, похоже, он работает для меня.

получил его здесь: http: // tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/

26
ответ дан Nicolas Dermine 22 August 2018 в 20:27
поделиться
  • 1
    Я думаю, что я могу использовать function в PowerShell , чтобы свести команду только к имени функции и использовать $args для передачи хэша commit только один раз. В * nix вы, вероятно, можете использовать shell-scripting для достижения такого же эффекта. – ADTC 28 August 2014 в 05:10
  • 2
    Человек ... Я владею тебе пивом :) – deanpodgornik 2 April 2015 в 18:41
  • 3
    @BenSewards для диапазона коммитов между commit1 и commit2 (включая позднее commit, исключая более раннюю фиксацию, порядок не имеет значения) просто выполните git archive -o patch.zip HEAD /**or a commit**/ $(git diff --name-only commit1 commit2). Конец, переданный команде archive, может быть произвольным commit (скорее всего, HEAD или более поздняя фиксация) , и файлы вытягиваются так, как если бы они были извлечены на этом этапе фиксации. Команды commit1 и commit2 , переданные в diff, используются только для генерации списка файлов, которые нужно вытащить - они не влияют на версию выталкиваемых файлов. – ADTC 23 November 2015 в 03:56
  • 4
    Дополнительная подсказка: Если вы хотите объединить измененные файлы нескольких диапазонов коммитов в один архив, просто повторите команду diff с точкой с запятой: git archive -o patch.zip HEAD /**or a commit**/ $(git diff --name-only commit1A commit1B; git diff --name-only commit2A commit2B; git diff --name-only commit3A commit3B) – ADTC 23 November 2015 в 04:28
  • 5
    Из-за пробелов в именах путей мне пришлось использовать канал для xargs, обрабатывающий NUL git diff -z --name-only commit1 commit2 | xargs -0 git archive -o patch.zip HEAD – Boggin 2 June 2016 в 10:03

Вот небольшой скрипт bash (Unix), который я написал, который скопирует файлы для заданного хеширования фиксации с помощью структуры папок:

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

Создайте файл с именем '~ / Scripts / copy- commit.sh ', затем предоставить ему права выполнения:

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

Затем из корня репозитория git:

~/Scripts/copy-commit.sh COMMIT_KEY ~/Existing/Destination/Folder/
0
ответ дан Patrick.SE 22 August 2018 в 20:27
поделиться

Мне нужно было обновить тестовый сервер и добавить файлы, измененные с версии 2.1. Для меня работало аналогичное решение, как James Ehly, но в моем случае я хотел экспортировать в архив пакет разницы между двумя старыми тегами - tag_ver_2.1 и tag_ver_2.2, а не только один.

Например: tag_ver_2.1 = 1f72b38ad tag_ver_2.2 = c1a546782 Здесь приведен пример:

git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar
7
ответ дан pietr 22 August 2018 в 20:27
поделиться
  • 1
    Я только что обнаружил проблему WEIRD: если я пробую код выше, он работает как шарм. Но я изменяю tar -rf test.tar для tar -zcf test.tar.gz, тогда в результирующем файле отсутствует несколько файлов. Что может быть причиной этой разницы в результате? – Alberto Alexander Rodriguez 19 June 2017 в 16:40
10
ответ дан Wendel 22 August 2018 в 20:27
поделиться
0
ответ дан Ashutosh Tripathy 5 November 2018 в 17:41
поделиться
0
ответ дан Raj Hawaldar 5 November 2018 в 17:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: