Как написать команды git для отдельного файла истории?

Я бы хотел, чтобы git команды не записывались в $HISTFILE, а вместо этого отслеживали их в собственном файле.

Я ожидаю, что все команды, отличные от git, будут записаны в $HISTFILE, а все команды, соответствующие "git*", будут записаны в ~/.git_history.

Вы также хотите загрузить этот другой файл в свою историю? Если вы не загрузите другой файл во вновь открытые оболочки, вам придется повторно ввести команды git вручную. Если вы хотите загрузить другой файл: в каком порядке должны быть объединены оба файла истории?

Socowi 26.03.2019 11:54

Из любопытства: почему вы хотите хранить команды git в отдельном файле? В зависимости от вашей скрытой цели может быть более простое решение.

Socowi 26.03.2019 11:57

Возможно, вы можете сделать это, зашифровав свой HISTFILE следующим образом: askubuntu.com/a/261667

Jona 26.03.2019 12:03

@Socowi - Если я неправильно понял ваши вопросы, дайте мне знать. Я не хочу загружать файл «.git_history» в оболочку при выполнении «истории». Мне они тоже не нужны. Конечная цель — очистить мою историю bash, а также сохранить журнал моих команд git. Я мог бы добавить «git*» в HISTIGNORE, но я не уверен, как перенаправить эту команду в другой файл журнала. Файл ".git_history" должен быть отсортирован по самым последним (аналогично .bash_history). Я предполагаю, что в худшем случае я мог бы добавить ночной cron для перемещения «git *» из .bash_history в другой файл?

Paul 26.03.2019 12:13

Если вы удалите команды git из истории вашей оболочки, вы больше не сможете нажимать клавишу «вверх», чтобы использовать их снова.

evolutionxbox 26.03.2019 12:31

@Socowi Я чувствую запах проблемы XY.

evolutionxbox 26.03.2019 12:31

Это должно быть в Баше? Я полагаю, что в zsh есть программируемый редактор строк, который может справиться с этим. (Если это действительно то, чего вы хотите, я разделяю сомнения других комментаторов.)

Michał Politowski 26.03.2019 13:01

@MichałPolitowski - Спасибо, я посмотрю

Paul 26.03.2019 13:20

@evolutionxbox - я знаю, что он не будет доступен при нажатии на клавиатуре.

Paul 26.03.2019 13:21
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
9
109
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вот идея:

  1. Используйте переменную оболочки HISTIGNORE, чтобы отфильтровать все git команды из обычной истории команд.

  2. Создайте функцию оболочки с именем git, которая добавляет строку git $@ к ~/.git_history..., а затем выполняет /usr/bin/git "$@".

Но я не думаю, что это хорошая идея. Как указывает @evolutionxbox, если вы отфильтруете все команды git, вы не сможете выполнять завершение истории для команд git. (Я бы ненавидеть, что ...)

И в этом подходе есть существенный недостаток. Ваш фальшивый файл «истории» git будет содержать только аргументы команды для команды git после того, как оболочка расширит их. Вы не будете записывать то, что было расширено, и вы не будете записывать какие-либо перенаправления или конвейеры.


FWIW, я не думаю, что bash может записывать разные части вашего списка истории в разные файлы. Таким образом, вышеизложенное может быть настолько хорошим, насколько это возможно ... если вы не готовы изменить bash себя.

Спасибо. Я поиграю с вашим ответом и посмотрю, смогу ли я найти решение. Я довольно хорошо разбираюсь в git, поэтому я считаю, что куча git cmds, загромождающая мой файл истории, бессмысленна. Однако, если что-то пойдет не так, регистрация cmds в отдельном файле позволит мне отследить, что я напортачил.

Paul 26.03.2019 13:23

Чтобы получить нераскрытую команду, вы можете настроить ловушку DEBUG и проверить BASH_COMMAND. Если он начинается с git, добавьте его к .git_history.

Socowi 26.03.2019 14:03
Ответ принят как подходящий

Добавьте следующую функцию в свой .bashrc (или .bash_login, если вы используете Mac) и перезапустите терминал.

git() {
   fc -nl -0 | cut -c3- >> ~/.git_history
   history -d -1
   command git "$@"
}

Когда вы используете git в своей оболочке, вместо этого будет вызываться эта функция.

  • Первая строка извлекает вашу команду git точно так, как она будет сохранена в .bash_history (включая нерасширенные переменные, кавычки и т. д.), и добавляет ее в ~/.git_history.
  • Вторая строка удаляет вашу команду git из обычной истории bash.
  • Последняя строка выполняет вашу команду git как обычно.

Как обсуждалось в комментариях, .git_history будет служить только журналом введенных команд git. Вы не можете использовать или ctrlR, чтобы вернуть введенную команду git — даже в том же сеансе.

Другие вопросы по теме