我的工作空间中有许多文件,其中有我永远不想提交的小更改,但我想知道当我在其中添加新更改时。
-
示例1:使用
lerna
的Makefile
,但由于我几乎从不使用,并且不想在全局安装它,因此我在本地版本中用npx lerna
替换了lerna
。我不应该提交这个文件,而且我不能忽略这个文件,因为我需要跟踪我对它所做的任何其他更改。 -
示例2:一个包含到后端API的链接的文件,每个开发人员根据其家庭网络使用不同的IP地址设置该链接。
-
示例3:一个dockerfile,为每个开发人员不同的公钥在容器中设置一个环境变量。
我还有很多。
因此,浏览我的git更改需要花费时间,因为git状态被许多不需要的文件打乱了。
- 方案一:
.gitignore
这不是一个有效的解决方案,因为如果我更改了makefile或dockerfile以外的东西,我想知道文件是不同的,我需要提交新的更改。
- 方案二:
git update-index --assume-unchanged
git update-index --assume-unchanged file
然后git update-index --no-assume-unchanged file
这不是一个有效的解决方案,因为如果我将makefile或dockerfile标记为"假设不变",并且我做了一个重要的修改,那么该文件将不会显示在git状态中,除非我记得我需要对它应用--no-assume-unchanged
。
我正在寻找一个解决方案,基本上隐藏文件从我的本地变化,而它保持完全相同。然后,如果我更改了内容,它会再次显示,提醒我在里面做了新的修改。
我该怎么做呢?
我正在寻找一个解决方案,基本上会隐藏文件从我的局部变化,但它保持不变。然后,如果我改变内容,再次显示,提醒我做了新的修改里面。
这是Git所做的在默认情况下对于最新提交的内容。
解决方案是提交本地更改。你可以使用一个私有的本地分支,你可以不断地把它重置到"官方的"分支上。
老实说,我不认为这是git应该解决的情况,但这里有一个解决方案,可能对这种情况太复杂了。
这个想法是有一个快照文件夹,在其中保存您想要忽略的文件的副本(直到没有更改)。这个文件夹必须被忽略,所以在.gitignore
:
snapshot/
假设您在根文件夹中有一个Dockerfile
,您创建具有相同内容的文件snapshot/Dockerfile
。显然,Dockerfile
没有被忽略,因为您仍然希望检测更改,但是您还希望将其从git status
输出中排除。从最后一个开始,最简单的方法是创建一个像
git config alias.filter-status '!git status | grep -Ev ".*(Dockerfile|other_pattern_to_ignore).*"'
用
调用git filter-status
这个别名显示git status
的每一行,除了那些匹配指定模式的行。它会给出你想要的输出,当然,除非某些git描述与你的模式匹配。你唯一失去的是颜色。
现在的最后一部分:如何总是排除Dockerfile
只有当它没有改变?下面是snapshot
文件夹发挥作用的地方:首先添加一个pre-commit
钩子,该钩子将使用
Dockerfile
(以及要排除的所有文件)。git restore --staged Dockerfile
,除非Dockerfile
和snapshot/Dockerfile
不相同。在本例中,您不需要卸载它,因为您希望提交这些更改,并且您还需要使用新的Dockerfile
更新快照版本。当其他开发人员不得不对Dockerfile
进行pull
更改时,缺点是显而易见的:他们必须记得用合并的版本更新snapshot
文件夹。
顺便说一下,我不确定这是一个有效的解决方案,有一件事是肯定的:我不会用git来解决它。例如,关于Dockerfile
,您不能使用您所忽略的.env
文件吗?