Как сообщить git игнорировать отдельные строки, т.е. Gitignore для определенных строк кода

.gitignore может игнорировать целые файлы, но есть ли способ игнорировать определенные строки кода во время кодирования?

Я часто и неоднократно добавляю те же строки отладки в проект, но только для того, чтобы помнить, чтобы удалить их перед фиксацией. Я хотел бы просто сохранить строки в коде и git игнорировать их.

Ответ 1

Вот как вы можете сделать это с помощью фильтров git:

  1. Создать/открыть файл gitattributes:
    • <project root>/.gitattributes (будет совершено в репо)
      ИЛИ
    • <project root>/.git/info/attributes (не будет участвовать в репо)
  2. Добавьте строку, определяющую файлы для фильтрации:
    • *.rb filter=gitignore, т.е. запустить фильтр с именем gitignore для всех файлов *.rb
  3. Определите фильтр gitignore в вашем gitconfig:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d", т.е. удалить эти строки
    • $ git config --global filter.gitignore.smudge cat, то есть ничего не делать при извлечении файла из репо

Примечания:
Конечно, это для рубиновых файлов, применяемых, когда строка заканчивается на #gitignore, применяемых глобально в ~/.gitconfig. Измените это так, как вам нужно.

Внимание !!
Это оставляет ваш рабочий файл отличным от репо (конечно). Любая проверка или перебазировка будет означать, что эти строки будут потеряны! Этот прием может показаться бесполезным, поскольку эти строки постоянно теряются при проверке, перебазировании или извлечении, но у меня есть конкретный вариант использования, чтобы использовать его.

Просто git stash save "proj1-debug", пока фильтр неактивен (просто временно отключите его в gitconfig или что-то в этом роде). Таким образом, мой код отладки всегда может быть git stash apply для моего кода в любое время, не опасаясь, что эти строки будут случайно зафиксированы.

У меня есть возможная идея для решения этих проблем, но я попробую реализовать ее в другой раз.

Спасибо Руди и jw013 за упоминание фильтров git и атрибутов gitatributes.

Ответ 2

У меня была аналогичная проблема с написанием java-кода. Мое решение состояло в том, чтобы код разметки, который я не хотел комментировать, а затем добавил крюк pre-commit, который будет искать мою разметку:

#!/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