如何自定义diff git以忽略码数日期生成

时间:2012-06-09 09:26:57

标签: git yard

我正在使用yard来生成项目的文档。甚至认为可以生成的文档,因此并不真正需要的是versionned,我们决定这样做,是因为它可以更容易看到代码(评论)的变化,在实际documenation的影响。

问题是每个时间段生成文档,它会更改每个文件开头的日期,导致所有文件被视为已更改。

有没有办法告诉git忽略那些行来检测文件是否已经改变,或者是否有一种方法来配置码,如果它们相同则不重新生成文件?

由于

更新

我知道我可以做一个脚本或其他任何内容,如果日期已经改变,清理文件。 所以我的问题是有一种Git方法可以做,.i.e我是否应该阅读有关diff驱动程序的内容,或者我应该使用干净的脚本。

如果我要走向清洁路径,那么使用git hook或将其集成到doc生成中会更好。

最终,我对通过生成的文档中的特定提交跟踪更改的任何其他方式感兴趣。

我还没有真正解释我的问题是什么(以及为什么我要尝试对不需要的东西进行编辑)所以我们去了。

有时,代码中的一些修改搞砸了文档,因此我可以看到提交对文档的影响。

示例: 我使用modeline for vim(文件第一行的注释告诉vim不同的信息)

知道我有一个包含模块文档的文件

#vi: my vim setting 
# Documentation of module A
module A
  .... some code

end

在其他地方我使用这个模块

#vi : my vim setting

           ( 2 blank lines)
module A
   .... some different code
end

此时,一切都很好,A的文档将是Documentation of module A。但是如果有一个人(比如我)删除最后一个文件一个空行,只留下一个(是的,我要让模式行和代码之间的2空白行),然后院子认为,模式行是模块A的文档,这将是{ {1}}。

问题是,除了查看每一页之外,没有办法检测到文档被搞砸了。使用git,我可以快速查看并检查更改的内容,甚至可以找到什么时候(这很重要,因为那时我可以弄清楚它为什么会发生变化)。

6 个答案:

答案 0 :(得分:2)

我不熟悉码,但是没有办法让git忽略文件的一部分。

最简单的解决方案是修改构建过程以运行自定义脚本,该脚本从生成的文件中删除数据,或检查git-diff,如果只更改了日期,那么还原日期更改。

但是,根本不对任何生成的代码/文件进行版本控制会更加清晰。

答案 1 :(得分:2)

不是直接答案,只有元素:

  • git diff具有-G选项,仅保留与特定正则表达式匹配的补丁。似乎没有一个标志排除与您的日期行匹配的行,但也许您会有足够的想象力来构建一个除了您的日期行之外的任何内容的正则表达式。
  • diff有这样一个选项(diff -I),所以如果你能找到一种方法来将git生成的差异提供给diff,你就可以了。
  • meld是一个图形差异查看器,与git一起工作得很好 - 例如在项目目录上调用meld dir/会打开一个窗口,显示与HEAD存在差异的所有文件 - 并且可以使用正则表达式忽略某些行(编辑>首选项>文本过滤器)。它是针对Linux发行版打包的(至少对于Ubuntu而言),该网站声称它也可以在MacOS X和Windows上运行(我还没试过)。
  • 我没有尝试过与git集成的所有可用difftools,但它们可能提供类似的功能。

答案 2 :(得分:2)

不要那样做

不能对可从源重新生成的资产进行版本控制。确切地说,您遇到的原因是个坏主意:

  1. 您的历史记录会跟踪您不关心的更改。
  2. 您必须努力忽略与提交历史无关的微不足道的更改。
  3. 您可以在可以按需重新生成的数据上浪费存储库空间和处理时间。
  4. 有关版本内容和遗漏内容的相关讨论,请参阅https://stackoverflow.com/a/10855342/1301972

    如果你这样做......

    您可以在Git中创建自定义clean filter(或者在更新YARD时运行的shell脚本或Rake任务),在提交文档文件之前删除时间戳。例如:

    # Tested with: GNU findutils 4.4.2, GNU sed 4.2.1
    find doc -type f -iname \*html -exec sed -i '/id="footer"/,/\/div/ d' {} +
    

    这将删除YARD文档中的所有页脚,这样您就不会将这些行提交到历史记录中。这应该解决您的具体问题。

答案 3 :(得分:2)

根本没有文件中的日期就足够了吗?

特定于码的解决方案(但不是git特定的),如果你实际上没有使用这些日期 - 让码头不首先产生它们:

customtemplates/default/layout/html/footer.erb中创建一个空文件,然后将其包含在您的模板中:

  • 使用命令行

    yardoc --template-path ./customtemplates
    
  • 使用Rakefile

    YARD::Rake::YardocTask.new do |yardoc|
        yardoc.options = ["--template-path", "./customtemplates"]
    end
    

(或者,如果您仍想要对Yard进行确认,可以将以下内容放在customtemplates/default/layout/html/footer.erb文件中)

<div id="footer">
     Generated by <a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>.
</div>

或者您可以使用公司徽标或其他信息放入自己的页脚。

答案 4 :(得分:1)

我的问题几乎相同。它不是文档,而是IDE设置更改日期和时间的源文件。每次保存。

要求是在提交之前将此日期和时间设置为“漂亮”,这意味着没有秒,分钟应该舍入到15。

我认为最好的方法是在提交之前创建小的git命令来清理代码。插件。将其命名为git-cleanup并将其放在c:\Program Files (x86)\Git\libexec\git-core中(我正在使用Windows)。

所以现在在做git commit之前我正在运行git cleanup并完成所有工作。实际上,我认为甚至可以一次性运行它,比如git cleanup && git commit -a -m "Commit message"。或者为此命令创建自定义别名。

我使用ruby来创建这个小脚本。但您可以使用您选择的语言。 Git允许这样做。

答案 5 :(得分:0)

更新问题的模式解决方案

如果问题确实是VIM modelines,而不是存储在页脚中的日期,那么您可以使用预提交挂钩(客户端)或预接收或后接收挂钩(服务器端)在模式行之后立即检查换行符。例如,使用GNU sed:

sed -r '/^#[[:space:]]+vim?:/ {N; /\n[^\n]/q1}'

然后,您的挂钩可以显示差异,错误消息,或根据退出状态采取其他操作。重要的是,您的模式行将与后续文档块正确分开,YARD应该正确忽略。