这是我的场景。我在分支A,在那里我对本地工作副本上的某个文件做了一些更改。
/启动程序/文件.esb
我基本上想要以下内容:
1.完全忽略对此文件所做的更改。
1.从版本控制中取消对该文件的跟踪,我尝试使用. gitignore来实现这一点。
1.当我 checkout 不同的分支时,将对此文件的更改保留在我的本地工作文件夹中。A-〉开发-〉B-〉C等等...
我不能完成的是#3。一旦我 checkout 一个新的分支并进行拉取,旧的更改就会被覆盖在文件上。
为什么会发生这种情况?难道不应该将此文件路径包含到.gitignore中,从而有效地将此文件完全排除在版本控制触角之外吗?
我如何实现#3?
这个问题与“可能重复”链接中提到的问题不同。原因如下:
这里基本上是我想要的外行话。“把我的这一个特殊的文件放在一个'shell',既不会被覆盖在任何git操作,也不会得到考虑,如果改变”。它基本上排除了任何形式的版本控制同步之间的文件和staging/remote。这个本地文件和版本在staging/remote必须存在相互和完全断开。
2条答案
按热度按时间o75abkj41#
这是因为该文件已经是仓库的一部分了,所以当你切换分支时,你会从你要 checkout 的分支得到该文件的版本。gitignore文件只会阻止git查看不属于仓库的文件。所以git不会在
git add .
或git commit -a
等命令中包含某些文件。assume-unchanged选项会欺骗git看不到这些更改,但这意味着Git可以在 checkout 时随意覆盖文件,因为它知道文件与提交的版本没有区别。如果你想把这个文件从git控制中移除,并自己管理对它的更改,你可以使用
git rm --cached /launcher/file.esb
并提交更改。这会把这个文件从索引中移除,git也不再跟踪这个文件。--cached
选项阻止git从你的工作目录中移除这个文件。你可能需要为每个分支单独执行这个操作,因为从一个分支中删除文件并不会从其他分支中删除它要做到这一点,您可能需要撤消assume-unchanged,然后使用git stash
命令暂时隐藏您本地更改yi0zb3m42#
从版本控制中取消对该文件的跟踪,我尝试使用. gitignore来实现这一点。
当你更新索引时,
.gitignore
是只读的,也就是说,你准备下一次提交。如果一个文件已经被提交了,将它添加到.gitignore
并不能帮助告诉Git
停止跟踪该文件。您还必须从索引中删除(使用
git rm --cached
)并提交更改。只有这样,Git
才会停止跟踪该文件。将其名称添加到.gitignore
只会告诉它停止在git status
的输出中的Untracked files
部分列出该文件。然而,如果你 checkout 的提交是在你从repo中删除文件之前创建的,那么提交中包含了该文件,Git也会尝试 checkout 它。