Если вы работаете с несколькими проектами в 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
Разберём ключевые моменты:
[[ "$VSCODE_WS" != '${workspaceFolder}' ]]
– игнорируем случаи, когда VSCode не в рабочем пространстве (например, при открытии одиночного файла).[[ "$(dirname ...) == "$HOME/code" ]]
– разрешаем запись истории **только** для проектов в~/code
(замените на свою базовую директорию).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 номер_строки
ваш друг.