АнглийскийФранцузскийИспанский

Значок OnWorks

git-filter-branch - Интернет в облаке

Запустите git-filter-branch в бесплатном хостинг-провайдере OnWorks через Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS

Это команда git-filter-branch, которую можно запустить в бесплатном хостинг-провайдере OnWorks, используя одну из наших многочисленных бесплатных онлайн-рабочих станций, таких как Ubuntu Online, Fedora Online, онлайн-эмулятор Windows или онлайн-эмулятор MAC OS.

ПРОГРАММА:

ИМЯ


git-filter-branch - переписывать ветки

СИНТАКСИС


мерзавец ветвь фильтра [--env-filter ] [--tree-filter ]
[--index-filter ] [--parent-filter ]
[--msg-filter ] [--commit-filter ]
[--tag-name-filter ] [--subdirectory-filter ]
[--prune-пусто]
[--оригинал ] [-d ] [-f | --сила]
[-] [ ...]

ОПИСАНИЕ


Позволяет вам переписать историю ревизий Git, переписав ветки, упомянутые в
options>, применяя настраиваемые фильтры к каждой ревизии. Эти фильтры могут изменять каждое дерево
(например, удаление файла или выполнение перезаписи Perl для всех файлов) или информация о каждом
совершить. В противном случае вся информация (включая исходное время фиксации или информацию о слиянии)
будут сохранены.

Команда перезапишет только положительный ссылки, указанные в командной строке (например, если вы
pass а..б, только b будет переписан). Если вы не укажете фильтры, коммиты будут
повторяется без каких-либо изменений, которые обычно не действуют. Тем не менее, это
могут быть полезны в будущем для компенсации некоторых ошибок Git или чего-то подобного, поэтому такой
использование разрешено.

ЗАМЕТКА: Эта команда учитывает файл .git / info / grafts и ссылки в пространстве имен refs / replace /.
Если у вас есть определенные графты или ссылки на замену, запуск этой команды заставит их
постоянны.

ПРЕДУПРЕЖДЕНИЕ! Переписанная история будет иметь разные имена объектов для всех объектов и
не будет сходиться с исходной веткой. Вы не сможете легко толкать и
распределите переписанную ветку поверх исходной. Пожалуйста, не используйте это
команда, если вы не знаете все последствия, и избегайте ее использования в любом случае, если простой
одной фиксации будет достаточно, чтобы решить вашу проблему. (См. «ВОССТАНОВЛЕНИЕ ИЗ ДОБЫЧИ
REBASE »в git-перебазировать(1) для получения дополнительной информации о переписывании опубликовано
история.)

Всегда проверяйте правильность переписанной версии: исходные ссылки, если они отличаются от
перезаписанные будут сохранены в пространстве имен ссылки / оригинал /.

Обратите внимание: поскольку эта операция требует больших затрат на ввод-вывод, было бы неплохо перенаправить
временный каталог вне диска с -d вариант, например, в tmpfs. Как сообщается, ускорение
очень заметно.

Фильтры
Фильтры применяются в порядке, указанном ниже. В аргумент всегда
оценивается в контексте оболочки с использованием Eval команда (с заметным исключением
фильтр фиксации по техническим причинам). До этого переменная окружения $ GIT_COMMIT
будет содержать идентификатор перезаписываемого коммита. Кроме того, GIT_AUTHOR_NAME,
GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, GIT_COMMITTER_NAME, GIT_COMMITTER_EMAIL и
GIT_COMMITTER_DATE берутся из текущего коммита и экспортируются в среду, в
чтобы повлиять на личность автора и коммиттера заменяющего коммита, созданного
git-коммит-дерево(1) после того, как фильтры поработали.

Если какая-либо оценка возвращает ненулевой статус выхода, вся операция будет
прервана.

A карта доступна функция, которая принимает аргумент "исходный идентификатор sha1" и выводит
"rewritten sha1 id", если фиксация уже была переписана, и "original sha1 id"
иначе; в карта функция может возвращать несколько идентификаторов в отдельных строках, если ваш фильтр фиксации
испустил несколько коммитов.

ДОПОЛНИТЕЛЬНЫЕ ОПЦИИ


--env-filter
Этот фильтр можно использовать, если вам нужно только изменить среду, в которой выполняется фиксация.
будет выполнено. В частности, вы можете захотеть переписать автора / коммиттера
переменные среды имя / адрес электронной почты / время (см. git-коммит-дерево(1) для подробностей). Не надо
забудьте повторно экспортировать переменные.

- дерево-фильтр
Это фильтр для перезаписи дерева и его содержимого. Аргумент оценивается
в оболочке с рабочим каталогом, установленным в корень извлеченного дерева. Новый
дерево затем используется как есть (новые файлы добавляются автоматически, исчезнувшие файлы автоматически удаляются
- ни файлы .gitignore, ни какие-либо другие правила игнорирования ИМЕТЬ ЛЮБОЕ ЭФФЕКТ!).

--index-filter
Это фильтр для перезаписи индекса. Он похож на древовидный фильтр, но делает
не проверять дерево, что делает его намного быстрее. Часто используется с git rm
--cached --ignore-unmatch ..., см. ПРИМЕРЫ ниже. Для волосатых случаев см. git-обновление-
индекс(1).

--parent-filter
Это фильтр для перезаписи родительского списка коммита. Он получит родительский
строка на stdin и должна выводить новую родительскую строку на stdout. Родительская строка
в формате, описанном в git-коммит-дерево(1): пусто для начальной фиксации, "-p
parent "для нормальной фиксации и" -p parent1 -p parent2 -p parent3 ... "для слияния
совершить.

--msg-фильтр
Это фильтр для перезаписи сообщений фиксации. Аргумент оценивается в
оболочка с исходным сообщением фиксации на стандартном вводе; используется его стандартный вывод
как новое сообщение фиксации.

--commit-filter
Это фильтр для выполнения фиксации. Если этот фильтр указан, он будет
называется вместо мерзавец дерево фиксации команда с аргументами формы "
[(-п ) ...] "и сообщение журнала на стандартном вводе. Ожидается идентификатор фиксации.
на стандартный вывод.

В качестве специального расширения фильтр фиксации может выдавать несколько идентификаторов фиксации; в этом случае,
все переписанные дочерние элементы исходного коммита будут родителями.

Вы можете использовать карта функция удобства в этом фильтре и другие удобства
функции тоже. Например, позвонив пропустить_commit "$ @" оставит текущий
зафиксировать (но не его изменения! Если вы этого хотите, используйте мерзавец перебазировать вместо).

Вы также можете использовать git_commit_non_empty_tree «$ @» вместо git commit-tree «$ @», если
вы не хотите сохранять коммиты с одним родителем, и это не меняет
дерево.

- тег-имя-фильтр
Это фильтр для перезаписи имен тегов. Когда он будет принят, он будет вызываться для каждого
ссылка на тег, указывающая на перезаписанный объект (или на объект тега, указывающий на
переписанный объект). Исходное имя тега передается через стандартный ввод, а новый тег
имя ожидается на стандартном выходе.

Исходные теги не удаляются, но могут быть перезаписаны; используйте "--tag-name-filter cat"
просто обновить теги. В этом случае будьте очень осторожны и убедитесь, что у вас есть
резервные копии старых тегов на случай, если преобразование не удастся.

Поддерживается почти правильная перезапись объектов тегов. Если в теге есть сообщение
прикреплен, будет создан новый объект тега с тем же сообщением, автором и
отметка времени. Если к тегу прикреплена подпись, она будет удалена. это
по определению невозможно сохранить подписи. Причина, по которой это "почти" правильно,
потому что в идеале, если тег не изменился (указывает на тот же объект, имеет тот же
имя и т. д.) он должен сохранять любую подпись. Это не так, подписи будут
всегда удаляются, покупатель остерегается. Также нет поддержки смены автора или
отметка времени (или сообщение тега, если на то пошло). Теги, указывающие на другие теги, будут
переписан, чтобы указать на лежащую в основе фиксацию.

--subdirectory-filter
Посмотрите только на историю, которая касается данного подкаталога. Результат будет содержать
этот каталог (и только он) в качестве корня проекта. Подразумевается раздел под названием «Переназначить
предку ».

--prune-пусто
Какие-то фильтры будут генерировать пустые коммиты, которые оставили нетронутым дерево. Этот
переключатель позволяет git-filter-branch игнорировать такие коммиты. Хотя этот переключатель только
применяется для коммитов, у которых есть один и только один родитель, следовательно, он будет сохранять слияния
точки. Также этот вариант несовместим с использованием --коммит-фильтр. Хотя
вам просто нужно использовать функцию git_commit_non_empty_tree "$ @" вместо мерзавца
идиома дерева фиксации "$ @" в вашем фильтре фиксации, чтобы это произошло.

--оригинал
Используйте эту опцию, чтобы установить пространство имен, в котором будут храниться исходные коммиты. В
значение по умолчанию ссылки / оригинал.

-d
Используйте эту опцию, чтобы установить путь к временному каталогу, используемому для перезаписи. Когда
применяя древовидный фильтр, команде необходимо временно проверить дерево на некоторых
каталог, который может занимать много места в случае больших проектов. По умолчанию
он делает это в .git-rewrite / каталог, но вы можете переопределить этот выбор этим
Параметр.

-ф, --сила
мерзавец ветвь фильтра отказывается начинать с существующего временного каталога или когда там
уже являются рефери, начиная с ссылки / оригинал /, если только не принудительно.

...
Аргументы за мерзавец список изменений. Все положительные ссылки, включенные в эти опции, переписываются.
Вы также можете указать такие параметры, как --все, но вы должны использовать -- отделить их от
мерзавец ветвь фильтра параметры. Подразумевается раздел под названием «Переназначить к предку».

Переоформления в предок
С помощью список изменений(1) аргументы, например, ограничители пути, вы можете ограничить набор ревизий
которые переписываются. Однако положительные ссылки в командной строке различаются: мы
не позволяйте им быть исключенными такими ограничителями. Для этого они вместо этого переписываются
чтобы указать на ближайшего предка, который не был исключен.

ПРИМЕРЫ


Предположим, вы хотите удалить файл (содержащий конфиденциальную информацию или
нарушение) от всех коммитов:

git filter-branch --tree-filter 'rm filename' ЗАГОЛОВОК

Однако, если файл отсутствует в дереве некоторого коммита, простое имя файла rm будет
потерпите неудачу для этого дерева и выполните фиксацию. Таким образом, вы можете вместо этого использовать rm -f filename в качестве
скрипты.

Использование --index-filter с мерзавец rm дает значительно более быструю версию. Как и при использовании rm
filename, git rm --cached filename завершится ошибкой, если файл отсутствует в дереве
совершить. Если вы хотите «полностью забыть» файл, неважно, когда он был введен.
history, поэтому мы также добавляем --ignore-unmatch:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD

Теперь вы получите перезаписанную историю, сохраненную в HEAD.

Чтобы переписать репозиторий, чтобы он выглядел так, как будто foodir / был его корнем проекта, и отбросить все
другая история:

git filter-branch --subdirectory-filter foodir - --all

Таким образом, вы можете, например, превратить подкаталог библиотеки в собственное хранилище. Обратите внимание --
что отделяет ветвь фильтра параметры из параметров ревизии и --all для перезаписи всех
ветки и бирки.

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

git filter-branch --parent-filter 'sed "s / ^ \ $ / - p /"' ГОЛОВА

(если родительская строка пуста - что происходит, когда мы имеем дело с первоначальной фиксацией
- добавить graftcommit как родительский). Обратите внимание, что это предполагает историю с одним корнем (что
есть, никакого слияния без общих предков не произошло). Если это не так, используйте:

git filter-branch --parent-filter \
'тест $ GIT_COMMIT = && эхо "-p "|| ГОЛОВА кота

или даже проще:

echo "$ commit-id $ graft-id" >> .git / info / grafts
git filter-branch $ graft-id..HEAD

Чтобы удалить из истории коммиты, созданные "Darl McBribe":

git filter-branch --commit-filter '
если ["$ GIT_AUTHOR_NAME" = "Дарл МакБрайб"];
тогда
skip_commit "$ @";
еще
git commit-tree "$ @";
fi 'ГОЛОВА

Функция пропустить_commit определяется следующим образом:

skip_commit ()
{
сдвиг;
в то время как [-n "$ 1"];
do
сдвиг;
карта «$ 1»;
сдвиг;
сделано;
}

Магия сдвига сначала отбрасывает идентификатор дерева, а затем параметры -p. Обратите внимание, что это
обрабатывает слияния правильно! В случае, если Дарл совершил слияние между P1 и P2, это будет
распространяется правильно, и все дочерние элементы слияния станут коммитами слияния с P1, P2 как
их родители вместо слияния фиксируют.

ЗАМЕТКА изменения, внесенные коммитами, и которые не отменяются последующими
совершает, все еще будет в переписанной ветке. Если ты хочешь выбросить изменения вместе
с коммитами вы должны использовать интерактивный режим мерзавец перебазировать.

Вы можете переписать сообщения журнала фиксации, используя --msg-filter. Например, мерзавец SVN-идентификатор
строки в репозитории, созданном мерзавец СВН можно удалить так:

git filter-branch --msg-filter '
sed -e "/ ^ git-svn-id: / d"
'

Если вам нужно добавить Принято строки, скажем, для последних 10 коммитов (ни одна из которых не является слиянием),
используйте эту команду:

git filter-branch --msg-filter '
Кот &&
echo "Принято: Bugs Bunny[электронная почта защищена]>"
'ГОЛОВА ~ 10..ГЛАВА

Параметр --env-filter может использоваться для изменения личности коммиттера и / или автора. Для
Например, если вы узнали, что ваши коммиты имеют неправильную идентификацию из-за неправильно настроенной
user.email, вы можете внести исправления перед публикацией проекта, например:

git filter-branch --env-filter '
если тест "$ GIT_AUTHOR_EMAIL" = "root @ localhost"
тогда
GIT_AUTHOR_EMAIL =[электронная почта защищена]
экспортировать GIT_AUTHOR_EMAIL
fi
если тест "$ GIT_COMMITTER_EMAIL" = "root @ localhost"
тогда
GIT_COMMITTER_EMAIL =[электронная почта защищена]
экспорт GIT_COMMITTER_EMAIL
fi
' -- --все

Чтобы ограничить перезапись только частью истории, укажите диапазон ревизий в дополнение к
новое название ветки. Новое имя ветки будет указывать на самую верхнюю ревизию, которую мерзавец
список изменений из этого диапазона будут напечатаны.

Рассмотрим эту историю:

D - E - F - G - H
/ /
А - Б ----- В

Чтобы переписать только коммиты D, E, F, G, H, но оставьте только A, B и C, используйте:

git фильтр-ветвь ... C..H

Чтобы переписать коммиты E, F, G, H, используйте один из них:

git filter-branch ... C..H - not D
git filter-branch ... D..H - not C

Чтобы переместить все дерево в подкаталог или удалить его оттуда:

git filter-branch --index-filter \
'git ls-files -s | sed "s- \ t \" * - & newsubdir / - "|
GIT_INDEX_FILE = $ GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$ GIT_INDEX_FILE.new" "$ GIT_INDEX_FILE" 'HEAD

КОНТРОЛЬНЫЙ Для Усыхание A РЕПОЗИТОРИЙ


git-filter-branch можно использовать, чтобы избавиться от подмножества файлов, обычно с некоторыми
комбинация --index-filter и --subdirectory-filter. Люди ожидают результата
репозиторий должен быть меньше оригинала, но вам нужно сделать еще несколько шагов, чтобы сделать
он меньше, потому что Git изо всех сил старается не потерять ваши объекты, пока вы ему не скажете. Первый
убедись в том, что:

· Вы действительно удалили все варианты имени файла, если большой двоичный объект был перемещен за время своего существования.
git log --name-only --follow --all - filename может помочь вам найти переименования.

· Вы действительно отфильтровали все ссылки: используйте --tag-name-filter cat - --all при вызове
git-фильтр-ветвь.

Тогда есть два способа получить репозиторий меньшего размера. Более безопасный способ - клонировать, чтобы сохранить
Ваш оригинал в целости и сохранности.

· Клонируйте его с помощью git clone file: /// path / to / repo. Клон не будет удален
объекты. Видеть git-клон(1). (Обратите внимание, что клонирование с простым путем только жесткие ссылки
все!)

Если вы действительно не хотите клонировать его по каким-либо причинам, проверьте следующие пункты
вместо этого (в таком порядке). Это очень деструктивный подход, поэтому сделать a резервная копия или вернуться
к его клонированию. Вы были предупреждены.

· Удалите исходные ссылки, зарезервированные с помощью git-filter-branch: скажем, git for-each-ref
--format = "% (refname)" refs / original / | xargs -n 1 git update-ref -d.

· Удалите все рефлоги с помощью git reflog expire --expire = now --all.

· Сбор мусора для всех объектов, на которые нет ссылок, с помощью git gc --prune = now (или если ваш git-gc
недостаточно новый, чтобы поддерживать аргументы --prune, используйте git repack -ad; git prune
вместо).

ПРИМЕЧАНИЯ


git-filter-branch позволяет выполнять сложные перезаписи истории Git с помощью сценария оболочки,
но вам, вероятно, не нужна такая гибкость, если вы просто удаление нежелательный данным " У аборигенов
большие файлы или пароли. Для этих операций вы можете рассмотреть Команда BFG
Репо-очиститель[1], альтернатива git-filter-branch на основе JVM, обычно не менее 10-50x
быстрее для этих случаев использования и с совершенно другими характеристиками:

· Любая конкретная версия файла очищается точно консолидировать. BFG, в отличие от
git-filter-branch, не дает вам возможности обрабатывать файл иначе
в зависимости от того, где и когда это было совершено в вашей истории. Это ограничение дает
основное преимущество BFG в производительности и хорошо подходит для задачи очистки плохих
данные - вам все равно в котором плохие данные, вы просто хотите это ушел.

· По умолчанию BFG в полной мере использует многоядерные машины, очищая фиксацию
файловые деревья параллельно. git-filter-branch очищает коммиты последовательно (т. е. в
однопоточным способом), хотя это is можно писать фильтры, включающие собственные
параллелизм в скриптах, выполняемых для каждой фиксации.

· The команду кредита[2] гораздо более строгие, чем ветка git-filter, и выделены
просто для задач удаления нежелательных данных, например: --strip-blobs-large-than 1M.

GIT


Часть мерзавец(1) люкс

ПРИМЕЧАНИЯ


1. BFG Repo-Cleaner
http://rtyley.github.io/bfg-repo-cleaner/

2. параметры команды
http://rtyley.github.io/bfg-repo-cleaner/#Примеры

Используйте git-filter-branch онлайн с помощью сервисов onworks.net


Бесплатные серверы и рабочие станции

Скачать приложения для Windows и Linux

Команды Linux

Ad