2010-04-22 125 views
24

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

这是正常的吗?我可以看出它是如何发生的,因为分支B认为它不在那里,而分支A认为它是这样的,所以当我回到B时它会“清除它”。但它有点烦人。

有什么建议吗?

+0

是否有理由不能在所有分支中忽略它或将它包含在所有分支中? – ewall 2010-04-22 14:57:16

+0

这里有一个有趣的问题:如果您将它添加到分支A上的.gitignore,然后想要将其添加到分支B上的.gitignore,则必须签出分支B,在该点删除文件 - 在您拥有有机会忽略它。你可能需要在你的工作目录中有一个脏的.gitignore,*当你切换分支时包含文件*以避免文件被删除。 – Armand 2010-04-22 15:41:01

+0

@艾莉森G:你的情况没有多大意义。为了实现这一切,必须在分支A上对文件进行跟踪*。因此,您不会将其添加到分支A上的gitignore中。由于文件在一个分支上被跟踪,并且不存在另一个。忽略它的唯一影响是允许您从B到A,而不会被警告您覆盖工作树中的文件。 – Cascabel 2010-04-22 17:04:28

回答

2

这很正常,虽然我有点惊讶的一步。

当你从B切换到A时,git发现文件必须更新以匹配A的版本,并且默默地执行,因为你已经忽略了它,说到分支B而言,文件没有'没关系。它必须这样做 - 唯一的选择是拒绝检出分支A.(如果文件没有被忽略,它会拒绝,并说“未经操作的工作树文件”会被合并覆盖“我真的很惊讶在这种情况下它也没有这样做任何人都有任何洞察力,这是否是功能或错误?)

当你切换回,git看到分支B没有该文件,并将其删除。再次,它必须这样做。它没有办法读你的思想,并意识到忽略文件在那一分钟前是你想要的 - 它只是给你分支B的内容,它指出文件不存在。

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

4

由于唯一可行的办法是跟踪在任何时候文件“f”,你可以添加,只有在分支B,一个smudge/clean processgitattributes filter driver

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

当checkouting分支B

  • 涂抹过程中会改变:

    • 保存f内容在一个临时文件
    • 替换f一个fbis文件中的内容(一个跟踪文件,该文件将包含分支B的“B内容的f”)
  • 清洁工艺将:

    • 节省f在的内容(如修改B
    • 恢复f内容(与临时文件)(fbis获取与分支Bf修改承诺),这意味着f不承诺(在B忽略)

您可以添加,仍处于分支B,一个custom merge driver它将保护fbis从其他分支合并到B
合并驱动程序将始终保留B版本的fbis内容,确保忽略的文件f在分支B被签出时取回其内容。

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

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

+2

哇,@VonC这是一个了不起的答案,非常感谢。我不确定我是否足够聪明来理解它,但是......需要另一杯咖啡...... – 2010-04-28 08:46:32

+0

或者对于每个分支都有两个单独的工作目录,并完全避免检出问题......类似于SVN这就是我所做的分支模型。在不相关的记录上有一段有趣的历史记录:http://blog.red-bean.com/sussman/?p=20 – 2016-09-23 18:29:26

+0

@DanielSokolowski这实际上可能是自Git 2.5以来:http://stackoverflow.com/a/39626426/6309和http://stackoverflow.com/a/30185564/6309 – VonC 2016-09-23 20:12:38

0

我已经经历了类似的情况,我这样做:

我会打电话给其在的index.php结账删除的文件。

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

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

恢复在分支一的index.php从备份以前创建并在您的.gitignore再次忽略的index.php并提交此。

在你支路B添加的index.php,忽略你的.gitignore文件,提交和快乐。

+0

不适合我。 – blinry 2012-11-30 12:11:59

1

在git中忽略文件并不意味着它们没有修改。您可以在git中检入并管理文件,并在.gitignore中忽略它。

相关问题