Как сказать git игнорировать отдельные строки, т.е. gitignore для определенных строк кода
.gitignore
можно игнорировать целые файлы, но есть ли способ игнорировать определенные строки кода при кодировании?
Я часто и неоднократно добавляю одни и те же строки отладки в проект, только чтобы не забыть удалить их перед фиксацией. Я хотел бы просто сохранить строки в коде и игнорировать их.
2 ответа
Вот как вы можете сделать это с помощью фильтров git:
- Создать / открыть файл gitattributes:
- <корень проекта>/. gitattributes (будет передан в репо)
ИЛИ ЖЕ - <корень проекта>/.git/info/attribute (не будет передан в репо)
- <корень проекта>/. gitattributes (будет передан в репо)
- Добавьте строку, определяющую файлы для фильтрации:
*.rb filter=gitignore
, т.е. запустить фильтр с именемgitignore
на все*.rb
файлы
- Определите
gitignore
фильтр в вашемgitconfig
:$ git config --global filter.gitignore.clean "sed '/#gitignore$/'d"
удалить эти строки$ git config --global filter.gitignore.smudge cat
ничего не делать при извлечении файла из репо
Заметки:
Конечно, это для файлов ruby, применяемых, когда строка заканчивается #gitignore
применяется глобально в ~/.gitconfig
, Измените это так, как вам нужно для ваших целей.
Предупреждение!!
Это оставляет ваш рабочий файл отличным от репо (конечно). Любая проверка или перебазировка будет означать, что эти строки будут потеряны! Этот трюк может показаться бесполезным, поскольку эти строки многократно теряются при проверке, перебазировании или вытягивании, но у меня есть конкретный вариант использования, чтобы использовать его.
Просто git stash save "proj1-debug"
пока фильтр неактивен (просто временно отключите его в gitconfig
или что-то). Таким образом, мой код отладки всегда может быть git stash apply
в мой код в любое время, не опасаясь, что эти строки будут случайно зафиксированы.
У меня есть возможная идея для решения этих проблем, но я попробую реализовать ее в другой раз.
Спасибо Руди и jw013 за упоминание фильтров git и атрибутов gitatributes.
У меня была похожая проблема написания кода Java. Мое решение состояло в том, чтобы разметить код, который я не хотел фиксировать, и затем добавить хук предварительной фиксации, который будет искать мою разметку:
#!/bin/bash
#
# This hook will look for code comments marked '//no-commit'
# - case-insensitive
# - dash is optional
# - there may be a space after the //
#
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit")
if [ "$noCommitCount" -ne "0" ]; then
echo "WARNING: You are attempting to commit changes which include a 'no-commit'."
echo "Please check the following files:"
git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/ - /'
echo
echo "You can ignore this warning by running the commit command with '--no-verify'"
exit 1
fi