Для меня самым простым решением будет сохранение значения, когда счетчик равен максимальному. Поэтому достаточно одной строки:
df[df['count'] == df.groupby(['Mt'])['count'].transform(max)]
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id
git diff-tree -r $commit_id
: Возьмите diff данной фиксации своему родительскому элементу (включая все подкаталоги, а не только верхнюю директорию). --no-commit-id --name-only
: Do не выводить commit SHA1. Вывести только имена затронутых файлов, а не полный diff. --diff-filter=ACMRT
: показывать только файлы, добавленные, скопированные, измененные, переименованные файлы или изменения их типа (например, файл → symlink) в этом совершить. Это исключает удаленные файлы. git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar
Чтобы обойти это, вот команда, переданная по типу. Это экспортирует файлы в архив tar.
Я сделал 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.
Вот однострочная команда, работающая в 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"
blockquote>
- echo FA отвечает на неизбежный xcopy вопрос о том, копируете ли вы файл или каталог (файл), и о возможном вопросе о перезаписывании файла (перезаписывать все)
- usebackq позволяет нам использовать вывод из нашей команды git в качестве входного сигнала для нашего предложения do
- HEAD ~ 1 HEAD получает все различия между предыдущей фиксацией и текущим HEAD
- % ~ fA преобразует git-выход в полностью определенные пути (необходимые для смены косой черты на обратную косую черту)
- C: \ git_changed_files \ где вы найдете все файлы, которые отличаются
, если хеш фиксации, например, 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/
function
в PowerShell i>, чтобы свести команду только к имени функции и использовать $args
для передачи хэша commit только один раз. В * nix вы, вероятно, можете использовать shell-scripting для достижения такого же эффекта.
– ADTC
28 August 2014 в 05:10
git archive -o patch.zip HEAD /**or a commit**/ $(git diff --name-only commit1 commit2)
. Конец, переданный команде archive
, может быть произвольным commit (скорее всего, HEAD или более поздняя фиксация) i>, и файлы вытягиваются так, как если бы они были извлечены на этом этапе фиксации. Команды commit1 i> и commit2 i>, переданные в diff
, используются только для генерации списка файлов, которые нужно вытащить - они не влияют на версию выталкиваемых файлов.
– ADTC
23 November 2015 в 03:56
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
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/
Мне нужно было обновить тестовый сервер и добавить файлы, измененные с версии 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
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