2010-04-01 104 views
2

我目前正在使用Subversion存储库,但我正在使用git在本地机器上工作。它使工作变得更容易,但是它也使得颠覆回购中的一些不良行为非常明显,并且给我造成了问题。使用Git处理颠覆操作:忽略对跟踪文件的修改

拉下代码后会有一些复杂的本地构建过程,它会创建(并且不幸地修改)一些文件。很明显,这些更改并不意味着被提交回存储库。不幸的是,构建过程实际上是在修改一些跟踪文件(是的,很可能是因为有人错误地将这些构建工件提交给了Subversion存储库)。由于这些修改将它们添加到我的忽略文件中对我没有任何帮助。

我可以避免检查这些变化回来它,我简单地不分阶段或提交它们,但有未分离的本地更改意味着我不能先彻底清除它们,然后重新分配。

我想知道的是,是否有任何方法可以忽略对一组跟踪文件的未来更改?另外,还有另一种方法来处理我遇到的问题,或者我只需告诉谁检查了这些文件来清理它们?

回答

3

作为Nathan said,清理这些文件(取消跟踪它们)是明智之举。

但如果你必须忽略跟踪的文件(当它涉及到忽略文件,这是不是本地的Git方式:Git的只有忽略非跟踪文件),你可以设置一个过程复制你想要的文件的内容忽略并恢复提交。

我最初相信,smudge/clean process,这是一个gitattributes filter driver可以做的伎俩:

alt text

,其中:

  • 涂抹过程将使这些文件的副本(当更新工作树)
  • 在构建过程中发生一些修改
  • 的清洁步骤(期间提交)将删除的文件的内容与第1步

,但正如stated in this post作出的副本,这将意味着滥用这一无国籍文件内容转型加入了状态上下文(即文件的完整路径名被弄脏/干净)。
那就是明确JC滨野禁止:

虽然我最初认为插值“%P”与路径,我最终决定反对它,从滥用这一变化的结果取决于有状态转换过滤器阻止人们准时,路径名,提交,分支和东西。

,并在有关的所有机制时也Linus Torvalds had some reservations

我不得不说,我显然不玩游戏的超级粉丝,但差异时非常干净。

它们实际上是有用吗?我不知道。我对这个功能的任何实际用户意味着什么感到有点紧张,但我不得不承认被干净的实现所迷惑。

我怀疑这会让我们有些抱怨,但我也怀疑人们会最终真的因为这样的事情而自责,然后责备我们,并在我们生活中造成巨大的痛苦支持这一点,人们希望“扩展语义”不再干净。

但我不知道真正的论证有多有效。我确实相信“给他们绳子”的理念。我想你也许可以这样欺负自己庄严这个问题,但是,嘿,任何人谁做,只有具有咎由自取


所以正确的地方加入某种保存/恢复机制(和有效地忽略任何变化一组跟踪在Git中文件)将是hooks

  • post-checkout:时调用更新工作树后运行git checkout。在那里你可以运行一个脚本收集所有的文件来忽略并保存在某个地方。

  • pre-commit:您可以获取建议的提交日志信息,并作出承诺之前运行将恢复这些文件的内容的第二脚本。

+0

我同意,我只是想要一个备份计划,以防万一这种情况不会发生。我必须使用存储库,但这些文件不是我的,我使用git来处理它。 – 2010-04-01 18:59:40

+0

我可以看到我将如何复制这些文件,但我不知道如何在干净的过滤器中引用文件名。有没有一个变量呢? – 2010-04-02 00:02:01

+0

@Chris:在阅读http://lists.zerezo.com/git/msg422632.html后,我不确定这个过滤器驱动程序是否是正确的工具,因为J.C. Hamano希望它是无状态的。 – VonC 2010-04-02 06:24:32

1

除非出现严重的政治性脑损伤,否则从源代码控制中删除工件是正确的步骤。 (或者说,“最有利”的一步,它总是正确的一步。)

我不知道有一种方法可以让git忽略对跟踪文件的更改。