Git игнорировать изменения в одной строке - PullRequest
1 голос
/ 08 апреля 2020

Я знаю, как полностью игнорировать указанные c строки в git, используя gitattributes (см. Как сказать git, чтобы игнорировать отдельные строки, т.е. gitignore для указанных c строк кода ) , но как бы я go о игнорировании заменяет на указанную c строку?

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

В качестве практического примера я пишу библиотеку C#, для которой требуется определенный c выходной путь сборки в зависимости от проекта, в котором он используется в качестве подмодуль. Таким образом, его необходимо настроить вручную, где бы он ни использовался, но это изменение не должно быть зафиксировано в самой библиотеке.

Original Library.csproj:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
    <OutputPath>bin\Debug\</OutputPath>
    ...
</PropertyGroup>

Submodule Library.csproj:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
    <OutputPath>..\Target\</OutputPath>
    ...
</PropertyGroup>

Как мне заставить git игнорировать изменение этой строки?

Ответы [ 3 ]

3 голосов
/ 08 апреля 2020

С git невозможно игнорировать ни одну строку кода. Как только файл отслеживается, весь файл индексируется.

Вместо того, чтобы изменять вывод местоположения сборки, окружающий код, который вызывает ваш проект, должен скопировать выходные данные сборки в правильное местоположение. Таким образом, вы не будете вмешиваться в целостность подмодуля.

Если вам нужно динамически изменить расположение вывода сборки, вы можете использовать переменную окружения, заданную до сборки. Таким образом, вы можете изменить это местоположение, изменив значение переменной среды.

2 голосов
/ 08 апреля 2020

Для этого очень специфического c случая вы можете установить свой чистый фильтр на заменить строку на стандартную строку по умолчанию . То есть вы читаете входящий поток данных XML, находите один элемент, заменяете его и генерируете новый поток (либо сгенерированный как полностью новый XML, либо «на лету» как go).

Хотя вся эта идея плохая. Это означает, что личная конфигурация пользователя хранится в существующем рабочем дереве в файле, который Git будет перезаписывать . Другими словами, существуют ситуации, при которых Git будет сказано безвозвратно уничтожить конфигурацию пользователя , и Git выполнит, и конфигурация будет уничтожена. Чтобы вернуть его обратно, вам понадобится не только чистый фильтр , но и грязный фильтр . Фильтр пятна должен откуда-то получить правильные данные конфигурации - этот не может быть файлом, который уничтожается и воссоздан прямо сейчас, - и поместить его в поток данных.

поэтому конфигурация также должна храниться в каком-то другом файле, который Git не будет перезаписывать , либо полностью вне рабочего дерева, либо никогда не фиксироваться. В этом случае вы можете просто прочитать значение из другого файла. Так что просто используйте этот файл. См. ответ Ben W для этой альтернативы.

В качестве другого варианта рассмотрите возможность чтения основных XML данных, например:

<OutputPath type="indirect">/etc/oursoftware.d/config.output</OutputPath>

, чтобы указать, что выход «путь» здесь - это имя другого файла - в данном случае /etc/oursofware.d/config.output, - который пользователь сконфигурирует, чтобы он содержал выходной путь. Или, если доступны переменные среды:

<OutputPath type="envvar">$OURSOFTWARE_OUTPUT_PATH</OutputPath>

, указывающие, что программное обеспечение должно запускаться как:

OURSOFTWARE_OUTPUT_PATH=/path/to/file.ext program

, например. Обратите внимание, что вы должны изменить свою C# программу, чтобы она понимала эти новые XML элементы управления.

0 голосов
/ 08 апреля 2020

Через несколько часов я пришел сюда, объединив два ответа, которые у меня есть в данный момент, и некоторые дополнительные исследования для моего решения:

Ответ на сам вопрос: Не действительно возможно игнорировать изменения в строке

Вы не можете игнорировать изменения в одной строке. На странице, на которую я ссылаюсь в своем вопросе, обсуждается только то, как УДАЛИТЬ одну строку из коммита, а не IGNORE CHANGES. Лучшей альтернативой было бы зацепить что-то, что заменило бы строку чем-то другим, когда вы нажимаете sh, и отложить то, что было первоначально удалено, когда вы тянете, что возможно, но очень утомительно. (См. "Clean" и "smudge" в документации Git Attributes )


Что касается решения, которое я выбрал для решения проблем со сборкой, я решил написать небольшой пакетный сценарий, запускаемый как Событие после сборки , который копирует файлы, созданные в целевой каталог, путь которого определяется в файле, игнорируемом из git, чтобы обеспечить модульность.


Другим хорошим решением, предложенным Луисом Сильвой, является использование файла .csproj.template и добавление .csproj к gitignore. Шаблон можно скопировать и изменить в соответствии с потребностями реализации.

...