Настройка отдельной истории команд Bash для каждого проекта в Visual Studio Code

Если вы работаете с несколькими проектами в VSCode, смешение истории команд терминала может превратиться в хаос. Представьте: вы вводите секретные ключи в одном проекте, а через неделю случайно коммитите файл истории в другой репозиторий. Последствия – от уязвимостей до публичного слива данных. Но решение есть, и оно не требует жертвовать удобством.

Давайте разберёмся, как настроить отдельные файлы истории для каждого рабочего пространства, не превращая проект в минное поле. Главное правило – никогда не хранить историю внутри самого проекта. Вместо этого используем гибкую систему, которая:

– Изолирует команды по рабочим областям
– Сохраняет файлы вне папок проектов
– Контролирует доступные директории для истории

Шаг 1: Настройка переменных окружения в VSCode

Откройте глобальный файл настроек VSCode (Ctrl + , → иконка шестерёнки → «Настройки (JSON)») и добавьте:

{
  "terminal.integrated.env.linux": {"VSCODE_WS": "${workspaceFolder}"},
  "terminal.integrated.env.windows": {"VSCODE_WS": "${workspaceFolder}"},
  "terminal.integrated.env.osx": {"VSCODE_WS": "${workspaceFolder}"}
}

Это создаёт переменную VSCODE_WS, содержащую путь к текущему проекту. Но не спешите радоваться – если остановиться здесь, история всё равно будет сохраняться внутри рабочей директории.

Шаг 2: Умная обработка в .bashrc

Добавьте в ваш ~/.bashrc следующий блок:

# Раздельная история для VSCode
if [[ -v VSCODE_WS ]] && [[ "$VSCODE_WS" != '${workspaceFolder}' ]]; then
    if [[ "$(dirname "${VSCODE_WS}")" == "$HOME/code" ]]; then
        HISTFILE="${VSCODE_WS}/../.bash_history_$(basename "${VSCODE_WS}")"
        shopt -s histappend
        if [[ ! "$PROMPT_COMMAND" =~ "history -a" ]]; then
            PROMPT_COMMAND="history -a;$PROMPT_COMMAND"
        fi
    fi
fi

Разберём ключевые моменты:

  1. [[ "$VSCODE_WS" != '${workspaceFolder}' ]] – игнорируем случаи, когда VSCode не в рабочем пространстве (например, при открытии одиночного файла).
  2. [[ "$(dirname ...) == "$HOME/code" ]] – разрешаем запись истории **только** для проектов в ~/code (замените на свою базовую директорию).
  3. HISTFILE=.../../.bash_history_... – сохраняем файлы на уровень выше проекта, чтобы они не попали в git-репозиторий.

Почему нельзя убрать проверку директории?
Без этого условия злоумышленник может создать папку с именем ~/.ssh и заставить ваш терминал записать историю прямо в неё. Даже если вы не открываете подозрительные проекты, риск остаётся при клонировании репозиториев.

Тонкости настройки и частые ошибки

Сценарий 1: Проекты во вложенных папках
Если ваша структура выглядит как ~/code/clientA/projectX, измените условие проверки:

[[ "$VSCODE_WS" == "$HOME/code/"* ]]

Сценарий 2: Уникальные имена для истории
Чтобы избежать конфликтов при одинаковых названиях проектов, используйте хеширование:

HISTFILE="$HOME/.vscode_history/$(echo "$VSCODE_WS" | md5sum | cut -d' ' -f1)"

Ошибка «Permission denied»:
Создайте директорию для истории заранее и установите права:

mkdir -p ~/.vscode_history && chmod 700 ~/.vscode_history
Способ храненияПлюсыМинусы
Рядом с проектом (../.bash_history_PROJ)Лёгкий поискРиск случайного включения в архив
Отдельная папка (~/.vscode_history)Полная изоляцияТребует настройки прав доступа

Дополнительная защита

Чтобы исключить попадание секретов в историю даже при сбоях:

1. Добавьте в .bashrc:

export HISTCONTROL=ignorespace  # команды с пробелом в начале не сохраняются
alias secret=' unset HISTFILE; history -d $(history 1)'  # пример: secret mysql -u root -p

2. Регулярно проверяйте историю через:

grep -RiE 'pass|key|token' ~/.vscode_history/

3. Настройте gitignore глобально:

echo ".bash_history_*" >> ~/.gitignore_global  
git config --global core.excludesfile ~/.gitignore_global

Помните: даже идеальная настройка не заменяет осторожность. Перед запуском подозрительных команд из интернета (особенно с curl | bash) делайте «сухой прогон» в изолированном окружении. И да, если где-то в истории всё же остался пароль – history -d номер_строки ваш друг.

Добавить комментарий

Все поля обязательны к заполнению. Ваш адрес email не будет виден никому.

Новое
Интересное