Я бы хотел, чтобы git команды не записывались в $HISTFILE, а вместо этого отслеживали их в собственном файле.
Я ожидаю, что все команды, отличные от git, будут записаны в $HISTFILE, а все команды, соответствующие "git*", будут записаны в ~/.git_history.
Из любопытства: почему вы хотите хранить команды git в отдельном файле? В зависимости от вашей скрытой цели может быть более простое решение.
Возможно, вы можете сделать это, зашифровав свой HISTFILE следующим образом: askubuntu.com/a/261667
@Socowi - Если я неправильно понял ваши вопросы, дайте мне знать. Я не хочу загружать файл «.git_history» в оболочку при выполнении «истории». Мне они тоже не нужны. Конечная цель — очистить мою историю bash, а также сохранить журнал моих команд git. Я мог бы добавить «git*» в HISTIGNORE, но я не уверен, как перенаправить эту команду в другой файл журнала. Файл ".git_history" должен быть отсортирован по самым последним (аналогично .bash_history). Я предполагаю, что в худшем случае я мог бы добавить ночной cron для перемещения «git *» из .bash_history в другой файл?
Если вы удалите команды git из истории вашей оболочки, вы больше не сможете нажимать клавишу «вверх», чтобы использовать их снова.
@Socowi Я чувствую запах проблемы XY.
Это должно быть в Баше? Я полагаю, что в zsh есть программируемый редактор строк, который может справиться с этим. (Если это действительно то, чего вы хотите, я разделяю сомнения других комментаторов.)
@MichałPolitowski - Спасибо, я посмотрю
@evolutionxbox - я знаю, что он не будет доступен при нажатии на клавиатуре.





Вот идея:
Используйте переменную оболочки HISTIGNORE, чтобы отфильтровать все git команды из обычной истории команд.
Создайте функцию оболочки с именем git, которая добавляет строку git $@ к ~/.git_history..., а затем выполняет /usr/bin/git "$@".
Но я не думаю, что это хорошая идея. Как указывает @evolutionxbox, если вы отфильтруете все команды git, вы не сможете выполнять завершение истории для команд git. (Я бы ненавидеть, что ...)
И в этом подходе есть существенный недостаток. Ваш фальшивый файл «истории» git будет содержать только аргументы команды для команды git после того, как оболочка расширит их. Вы не будете записывать то, что было расширено, и вы не будете записывать какие-либо перенаправления или конвейеры.
FWIW, я не думаю, что bash может записывать разные части вашего списка истории в разные файлы. Таким образом, вышеизложенное может быть настолько хорошим, насколько это возможно ... если вы не готовы изменить bash себя.
Спасибо. Я поиграю с вашим ответом и посмотрю, смогу ли я найти решение. Я довольно хорошо разбираюсь в git, поэтому я считаю, что куча git cmds, загромождающая мой файл истории, бессмысленна. Однако, если что-то пойдет не так, регистрация cmds в отдельном файле позволит мне отследить, что я напортачил.
Чтобы получить нераскрытую команду, вы можете настроить ловушку DEBUG и проверить BASH_COMMAND. Если он начинается с git, добавьте его к .git_history.
Добавьте следующую функцию в свой .bashrc (или .bash_login, если вы используете Mac) и перезапустите терминал.
git() {
fc -nl -0 | cut -c3- >> ~/.git_history
history -d -1
command git "$@"
}
Когда вы используете git в своей оболочке, вместо этого будет вызываться эта функция.
.bash_history (включая нерасширенные переменные, кавычки и т. д.), и добавляет ее в ~/.git_history.Как обсуждалось в комментариях, .git_history будет служить только журналом введенных команд git. Вы не можете использовать ↑ или ctrlR, чтобы вернуть введенную команду git — даже в том же сеансе.
Вы также хотите загрузить этот другой файл в свою историю? Если вы не загрузите другой файл во вновь открытые оболочки, вам придется повторно ввести команды git вручную. Если вы хотите загрузить другой файл: в каком порядке должны быть объединены оба файла истории?