Git忽略对单行的更改



我知道如何使用gitattributes完全忽略git中的特定行(请参阅如何告诉git忽略个别行,即gitignore用于特定的代码行(,但我该如何忽略对特定行的更改

我认为我们可以非常类似地使用过滤器,但我不知道sed脚本应该做什么来忽略对行的更改。

作为一个实际的例子,我正在编写一个C#库,它需要一个特定的构建输出路径,这取决于它作为子模块使用的项目。因此,无论在哪里使用,都必须手动配置它,但这种更改不能提交给库本身。

原始库.csproj:

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

子模块库.csproj:

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

如何让git忽略对此行的更改?

使用git,无法忽略一行代码。一旦跟踪了一个文件,就会对整个文件进行索引。

调用项目的周围代码应该将生成的输出复制到正确的位置,而不是更改生成位置的输出。这样就不会破坏子模块的完整性。

如果需要动态更改生成的输出位置,可以使用在生成之前设置的环境变量。通过这种方式,可以通过更改环境变量的值来更改位置。

对于这个非常特殊的情况,您可以设置干净的过滤器,用标准默认行替换该行。也就是说,您将读取传入的XML数据流,找到一个项,替换它,并生成新的流(要么作为全新的XML生成,要么在运行中动态生成(。

不过,整个想法很糟糕。这意味着用户的私有配置存储在他们现有的工作树中,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控件

几个小时后,我到达了这里,结合了我目前的两个答案和我的解决方案的一些补充研究:

问题本身的答案:不可能忽略对一行的更改

不能忽略对单行的更改。我在问题中提到的页面只讨论了如何从提交中删除一行,而不是忽略更改。最好的选择是在你推的时候挂上一些可以用其他东西代替绳子的东西,而在你拉的时候必须把最初取下的东西放回去,这是可能的,但非常乏味。(请参阅Git属性文档中的"干净"one_answers"污迹"(


至于我选择用于构建问题的解决方案,我决定编写一个小批量脚本,以构建后事件的形式运行,将构建的文件复制到目标目录,目标目录的路径在一个文件中定义,忽略git以实现模块化。

Luis Silva提出的另一个不错的解决方案是使用.csproj.template文件并将.csproj添加到gitignore中。可以复制和修改模板以适应实现的需要。

最新更新