当我切换分支时,Git正在删除被忽略的文件

时间:2010-04-22 14:20:00

标签: git

我有一个分支(让我们称之为B)忽略某个文件,在某些其他分支(例如分支A)中未被忽略。当我从分支B切换到分支A,然后再回到B时,文件已被删除。

这是正常的吗?我可以看到它会如何发生,在分支B认为它不存在的意义上,分支A认为它是,所以当我回到B时它“整理它”。但这有点烦人。

有什么建议吗?

6 个答案:

答案 0 :(得分:5)

由于唯一可行的解​​决方案是始终跟踪文件“f”,因此您只能在分支B中添加smudge/clean process gitattributes filter driver

https://raw.github.com/adisp007/ProGit/master/figures/18333fig0702-tn.png

检查分支B时:

  • 涂抹过程会改变:

    • f的内容保存在临时文件
    • f的内容替换为一个fbis文件(一个跟踪文件,其中包含分支B的{​​{1}}内容B “)
  • 清洁过程会:

    • f中保存f内容(已在B中修改)fbis通过分支fbis中的f修改提交<) / LI>
    • 恢复B内容(使用临时文件),意味着f未提交(在f中忽略)

您仍然可以在分支B中添加custom merge driver,以便在其他分支合并到B时保护fbis
合并驱动程序将始终保留BB内容版本,确保被忽略的文件fbis在检出分支f时收回其内容。

由于这些驱动程序(过滤器和合并)未在其他分支中提交,因此文件“f”将在其他分支中提交,并进行所有修改。
在分支B中,其内容永远不会更改,但只要B签出,对f所做的“本地修改”仍会恢复。

如果不需要恢复内容,则无需管理B 只需保留过滤器驱动程序,您就可以确定无论您对分支fbisf所做的任何修改,都不会提交这些更改,实际上会忽略B内容。

答案 1 :(得分:2)

这是正常的,虽然我对它的一步感到有些惊讶。

当你从B切换到A时,git会发现文件必须更新以匹配A的版本,并且因为你忽略它而默默地这样做,并说就分支B而言,文件没有物。它必须这样做 - 唯一的选择是拒绝检查分支A.(如果文件没有被忽略,它会拒绝,说“Untracked工作树文件''将被合并覆盖”。我真的很惊讶在这种情况下,它也不会这样做。任何人都有任何关于这个功能或错误的见解吗?)

当您切换回时,git看到分支B没有该文件,并将其删除。同样,它必须这样做。它没有办法读懂你的想法并意识到那个被忽略的文件就是你想要的那个 - 它只是给你分支B的内容,它说明文件不存在。

正如ewall在评论中建议的那样,如果您希望文件在这些转换中存活,则需要由所有分支跟踪,或在所有分支中忽略。

答案 2 :(得分:1)

忽略git中的文件并不意味着它们不会被修改。您可以在git中签入和管理文件,并在.gitignore中忽略它。

答案 3 :(得分:0)

我遇到了类似的情况,我这样做了:

我会调用 index.php 结帐时删除的文件。

在你的.gitignore 分支A 分支B 中删除忽略 index.php 的行,在此提交之后你的.gitignore两个分支。

分支A 中,创建 index.php 的备份,删除并提交。

从先前创建的备份中的分支A index.php 中恢复,并在.gitignore中再次忽略 index.php 并提交此

分支B 中添加 index.php ,忽略.gitignore中的文件,提交并感到高兴。

答案 4 :(得分:0)

答案

如果仅忽略分支B中的文件,而不忽略分支A中的文件,那么当从A切换到B时,就无法防止文件被删除

但是,从您的评论中,我看到您尝试忽略两个分支中的文件,但是该文件仍被删除。它可能仍在A中被跟踪。转到分支A,然后 从索引

中删除了被忽略的文件
git rm --cached <file>

当您将分支A推入存储库时,请小心。 This causes the file to get deleted on repository and other developers machines on their next git pull but not on your local。您可以在这些机器上拉后添加文件。


说明

我遇到了完全相同的问题。这是我发生的事情:

  1. 曾经在test.json中跟踪文件B
  2. 我从A创建了一个分支B(因此test.json中也跟踪了文件A)。
  3. 后来我忽略了分支test.json中的文件B。但是git将继续跟踪已经被跟踪的所有文件。为了停止跟踪文件,我从索引git rm --cached foo/test.json中删除了它。

这3个步骤之后,将发生以下情况:如果我在分支B中,则文件test.json存在。如果我切换到A,它仍然存在。如果我结帐回B,它就消失了。所以我注意到和你一样:

  

在分支B的意义上,我可以看到它会如何发生   认为它不在那里,而分支A认为它在那里,所以当我去时   回到B,它“收拾干净”。但这有点烦人。

我从分支test.json的{​​{1}}文件中添加了.gitignore,但是当切换回A时,它仍然被删除了。这是因为在我忽略它之前已在B中对其进行了跟踪。

因此,您需要将其从分支A中的索引中删除。然后,它会被AA忽略和取消跟踪,并且当您从B切换到A时,它不会被删除。

答案 5 :(得分:0)

您可以将文件添加到文件夹中并忽略该文件夹。切换分支时文件不会被删除。