Я использую git для синхронизации с телефонным разговором во время тестирования в собственном браузере телефона. Таким образом, у меня есть следующая строка:
var isPhoneGap = false;
Очевидно, я меняю это при сборке, но есть ли способ настроить git, чтобы игнорировать эту единственную строку, или мне нужно пойти и поместить ее в отдельный файл и игнорировать ее таким образом?
Я использую Gitx и терминал на OSX 10.6.
Ответы:
Если ваш файл относится к определенному типу, вы можете объявить драйвер фильтра содержимого , который вы можете объявить в
.gitattributes
файле (как показано в «Расширении ключевых слов» в « Атрибутах Git »):(вы даже можете установить этот фильтр для определенного файла , если хотите)
Воплощать в жизнь:
yourFilterName.smudge
(срабатываетgit checkout
) иyourFilterName.clean
(срабатываетgit add
)Ваш файл будет отображаться без изменений
git status
, но его извлеченная версия будет иметь правильное значение дляisPhoneGap
.источник
git diff or
git status`, игнорируя фильтры? Так что я все еще вижу, что изменилось? Мой вариант использования - журналы отладки ... которые в конечном итоге я хочу удалить ... @jthill @VonCsh ".git/helper.sh"
убедившись, что пропущены все параметры для sed"$@"
(я предполагаю, что передан только путь к файлу ).Ты можешь использовать
игнорировать изменения одного файла, которые вы не хотите отслеживать. Я использую это решение, когда мне нужно иметь файл в репозитории, но в этом файле есть некоторые части, которые меняются, и мне не нужно постоянно отслеживать.
Когда в файле есть важные изменения, вам необходимо сделать следующее:
Также см. Git doc update-index для
--[no-]assume-unchanged
параметра.источник
--skip-worktree
что это лучший вариант для большинства целей. stackoverflow.com/a/39583010/4233593git commit -a
это изменение можно зафиксировать бесплатно) »Gitx должен позволять вам фиксировать или игнорировать отдельные строки (вы, возможно, уже знаете это), но вам придется делать это каждый раз, когда вы фиксируете. Я думаю, что было бы лучше иметь файл конфигурации для каждой цели развертывания (вы можете версия для них) и некоторый параметр времени выполнения, независимо от того, запускаете ли вы сервер (например
./myserver --config=whatever.js
).источник
Продолжая https://stackoverflow.com/a/20574486/4935114 , @Mike предложил создать
pre-commit
перехватчик, который будетgrep
в поэтапных файлах для строк, которые можно игнорировать. Хук проверяет, были ли эти строки поставлены. Если да, то этоecho
предупреждение, и этоexit
связано с кодом,1
поэтому процесс фиксации не будет продолжен.Вдохновленный ответом @Mike , я обнаружил, что использую, возможно, улучшенную версию его крючка, который автоматически
reset
(с-p
флагом) определяет конкретную строку, которую мы хотим игнорировать.Я не уверен, что этот хук будет работать в ситуации, когда у вас есть много файлов с этой строкой, которые нужно игнорировать, но этот
pre-commit
хук ищет изменения в этой строке в конкретном файлеbuildVars.java
. Скрипт перехвата выглядел так, когда я тестировал его на своей машине.объяснение
Что я сделал, так это повторил контрольную последовательность, которая ищет регулярное выражение
isPhoneGap
во время интерактивногоreset
процесса. Таким образом, имитируя пользователя, который нажимает/
для поискаisPhoneGap
, нажимает,y
когда его спрашивают, хочет ли он отказаться от этого патча, и, наконец, нажимает,q
чтобы выйти из интерактивного режимаreset
.Интерактивный обратный процесс исправления описан здесь: https://git-scm.com/docs/git-add#git-add-patch
ПРИМЕЧАНИЕ. В приведенном выше сценарии предполагается, что переменная
interactive.singleKey
-false
. Если вы настроили свой наtrue
, удалите любой$'\n'
изecho
команды сразу после предупреждения.источник
Вот как это можно сделать с помощью фильтров git :
ИЛИ
*.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.
источник
Драйвер контентного фильтра - не лучшее решение. Вы можете скрыть эту строку от
git status
/ etc, но на самом деле она не игнорируется. Как только вы измените значение, ваш рабочий каталог будет помечен как грязный, даже если изменение может быть не видно.Если вы действительно хотите, чтобы эта строка вышла из-под контроля версий, единственным практическим средством может быть изменение ее аргумента командной строки или ее размещение в игнорируемом файле include или build.
источник
Я предполагаю, что это может быть что-то, что встречается более чем в одной строке вашего источника.
Я думаю, что было бы лучше всего иметь файл .userbuildconfig какого-либо типа, который вы просто включаете и устанавливаете значения по умолчанию. Затем вы можете использовать предложение Карлоса, чтобы пометить только этот файл, как предполагаемый без изменений. Таким образом не будут пропущены другие изменения в файле, в котором нужно проверить настройку.
Это может позволить вам настраивать макросы препроцессора локально (или для java что-то вроде этого https://stackoverflow.com/a/1813873/1270965 ).
источник
Нет. Вы можете игнорировать только отдельные файлы (и многое другое), поскольку строки в .gitignore соответствуют именам файлов, а не содержимому файла. Вы уже упомянули решение этой проблемы, то есть игнорируйте один файл, содержащий тот контент, который вы хотите игнорировать.
источник