2016-11-01 144 views
0

这是我的情况。我在分支A上,在那里我对本地工作副本上的某个文件进行了一些更改。Git忽略不工作

/launcher/file.esb

我基本上要执行以下操作:

  1. 忽略这个文件完全所做的更改。我用 完成了这个假设 - 不变
  2. 从版本控制中解除这个文件,我试图用.gitignore来完成这个文件。

  3. 当我签出不同分支时,保留对本地工作文件夹中此文件的更改。 A->培养─> B->ç等...

这是#3,我没能做到。只要我签出一个新的分支并执行pull操作,旧的更改就会覆盖该文件。

这是怎么发生的?不应该将这个文件路径包含到.gitignore中,这个文件完全无法使用版本控制触角?

我该如何实现#3?

这个问题不同于“可能的重复”链接中提到的问题。 继承人为什么:

这里基本上是我想要的内容。 “把我的这个特定的文件放在一个'shell'中,这个文件在任何git操作中都不会被覆盖,也不会在被修改时被考虑到。”它基本上不包括该文件和staging/remote之间的任何形式的版本控制同步。此本地文件和分段/远程版本必须存在相互连接和完全断开连接。

+0

可能重复[停止跟踪并忽略Git中文件的更改](http://stackoverflow.com/questions/936249/stop-tracking-and-ignore-changes-to-a-file-in-git ) –

回答

4

这是因为该文件已经是存储库的一部分。因此,当您切换分支时,您将从您正在检出的分支中获取此文件的版本。 gitignore文件仅阻止git查看不属于存储库一部分的文件。这是完成的,所以git不包括命令中的某些文件,如git add .git commit -a。假设 - 未改变的选项会让git看不到更改,但这意味着Git可以在签出时自由覆盖文件,因为它知道文件与提交版本没有区别。

如果你想要从git控制中删除这个文件并自己管理它的变化,你可以使用git rm --cached /launcher/file.esb并提交修改。这将从索引中删除该文件,该文件将不再由git进行跟踪。 --cached选项可防止git从您的工作目录中实际删除文件。不过,您可能必须为每个分支单独执行此操作,因为从一个分支中删除文件不会将其从其他分支中删除。要做到这一点,您可能需要撤消假设 - 不变,然后使用git stash命令临时隐藏您的本地更改。

+0

git rm --cached,我已经试过了,就像上百万次。问题是,当我提交git rm'd文件并将分支推送到原点时,该文件在PR期间显示为“已删除”。当我尝试将我的分支与开发合并时,该文件是否会从Dev中实际删除?无论哪种情况,我都遇到麻烦,因为该文件在PR期间显示为已删除。 – Ace

+0

这里基本上是我想说的。 “把我的这个特定的文件放在一个'shell'中,这个文件在任何git操作中都不会被覆盖,也不会在被修改时被考虑到。”它基本上不包括该文件和staging/remote之间的任何形式的版本控制同步。此本地文件和分段/远程版本必须存在相互连接和完全断开连接。 – Ace

+0

据我所知,没有标准的做你想做的方式。当你做'git pull'时,你基本上将远程仓库合并到你的本地仓库('git pull'基本上是'git fetch'和'git merge'的一个快捷方式)。所以如果一个文件被远程控制,它将被合并到本地的一个拉。简单的解决方法是在执行'git pull'之前执行'git stash'并在执行完后执行'git stash pop',这样您的本地更改就会保留下来。只要该文件没有被其他人以可能导致冲突的方式更改,那应该可以正常工作 –

1

从版本控制中解除这个文件,我试图用.gitignore来完成这个文件。

你试过了,你失败了。只有在更新索引时才会读取.gitignore,即您准备下一次提交。如果文件已经提交,将其添加到.gitignore无助于告知Git停止跟踪文件。

您还必须从索引中删除(使用[git rm --cached](https://git-scm.com/docs/git-rm))并提交更改。只有在Git停止跟踪文件。将它的名称添加到.gitignore只会告诉它不要将它列入git status输出的Untracked files部分。

但是,如果您签出在从回购库中移除文件之前创建的提交,提交包含该文件,Git也会尝试检查它。