我有一个分支(让我们称之为B)忽略某个文件,其中不是在某些其他分支(例如分支A)中被忽略。当我从分支B切换到分支A,然后再次回到B时,文件已被删除。当我切换分支时Git正在删除一个被忽略的文件
这是正常的吗?我可以看出它是如何发生的,因为分支B认为它不在那里,而分支A认为它是这样的,所以当我回到B时它会“清除它”。但它有点烦人。
有什么建议吗?
我有一个分支(让我们称之为B)忽略某个文件,其中不是在某些其他分支(例如分支A)中被忽略。当我从分支B切换到分支A,然后再次回到B时,文件已被删除。当我切换分支时Git正在删除一个被忽略的文件
这是正常的吗?我可以看出它是如何发生的,因为分支B认为它不在那里,而分支A认为它是这样的,所以当我回到B时它会“清除它”。但它有点烦人。
有什么建议吗?
这很正常,虽然我有点惊讶的一步。
当你从B切换到A时,git发现文件必须更新以匹配A的版本,并且默默地执行,因为你已经忽略了它,说到分支B而言,文件没有'没关系。它必须这样做 - 唯一的选择是拒绝检出分支A.(如果文件没有被忽略,它会拒绝,并说“未经操作的工作树文件”会被合并覆盖“我真的很惊讶在这种情况下它也没有这样做任何人都有任何洞察力,这是否是功能或错误?)
当你切换回,git看到分支B没有该文件,并将其删除。再次,它必须这样做。它没有办法读你的思想,并意识到忽略文件在那一分钟前是你想要的 - 它只是给你分支B的内容,它指出文件不存在。
正如ewall在评论中所建议的那样,如果您希望文件在这些转换中生存下来,它需要被所有分支跟踪,或者在所有分支中被忽略。
由于唯一可行的办法是跟踪在任何时候文件“f
”,你可以添加,只有在分支B
,一个smudge/clean process与gitattributes filter driver:
当checkouting分支B
:
涂抹过程中会改变:
f
内容在一个临时文件f
一个fbis
文件中的内容(一个跟踪文件,该文件将包含分支B
的“B
内容的f
”)清洁工艺将:
f
在的内容(如修改B
)f
内容(与临时文件)(fbis
获取与分支B
f
修改承诺),这意味着f
不承诺(在B
忽略)您可以添加,仍处于分支B
,一个custom merge driver它将保护fbis
从其他分支合并到B
:
合并驱动程序将始终保留B
版本的fbis
内容,确保忽略的文件f
在分支B
被签出时取回其内容。
由于这些驱动程序(过滤器和合并)未在其他分支中提交,文件'f'在其他分支中进行了所有修改。
在分支B
中,其内容将永远不会改变,但只要登出B
,对f
所做的“本地修改”仍会恢复。
如果不需要恢复内容,则无需管理fbis
。
只需保留过滤器驱动程序,您将确保无论您对f
分支B
所做的任何修改,这些更改都不会被提交,实际上将忽略f
内容。
哇,@VonC这是一个了不起的答案,非常感谢。我不确定我是否足够聪明来理解它,但是......需要另一杯咖啡...... – 2010-04-28 08:46:32
或者对于每个分支都有两个单独的工作目录,并完全避免检出问题......类似于SVN这就是我所做的分支模型。在不相关的记录上有一段有趣的历史记录:http://blog.red-bean.com/sussman/?p=20 – 2016-09-23 18:29:26
@DanielSokolowski这实际上可能是自Git 2.5以来:http://stackoverflow.com/a/39626426/6309和http://stackoverflow.com/a/30185564/6309 – VonC 2016-09-23 20:12:38
我已经经历了类似的情况,我这样做:
我会打电话给其在的index.php结账删除的文件。
在你的。支路A和支路B的gitignore除去忽略你的index.php行,在此之后提交您的.gitignore在两个分支。
分支A,创建备份index.php,删除并提交。
恢复在分支一的的index.php从备份以前创建并在您的.gitignore再次忽略的index.php并提交此。
在你支路B添加的index.php,忽略你的.gitignore文件,提交和快乐。
不适合我。 – blinry 2012-11-30 12:11:59
在git中忽略文件并不意味着它们没有修改。您可以在git中检入并管理文件,并在.gitignore
中忽略它。
是否有理由不能在所有分支中忽略它或将它包含在所有分支中? – ewall 2010-04-22 14:57:16
这里有一个有趣的问题:如果您将它添加到分支A上的.gitignore,然后想要将其添加到分支B上的.gitignore,则必须签出分支B,在该点删除文件 - 在您拥有有机会忽略它。你可能需要在你的工作目录中有一个脏的.gitignore,*当你切换分支时包含文件*以避免文件被删除。 – Armand 2010-04-22 15:41:01
@艾莉森G:你的情况没有多大意义。为了实现这一切,必须在分支A上对文件进行跟踪*。因此,您不会将其添加到分支A上的gitignore中。由于文件在一个分支上被跟踪,并且不存在另一个。忽略它的唯一影响是允许您从B到A,而不会被警告您覆盖工作树中的文件。 – Cascabel 2010-04-22 17:04:28