【问题标题】:Excluding files from git-diff从 git-diff 中排除文件
【发布时间】:2009-06-19 07:47:06
【问题描述】:

我正在用 git 跟踪一个项目。工作副本中有一些 Xcode 项目文件我想继续跟踪,但不想在差异中看到,因为总是有几十行我从来不感兴趣的更改行。有没有简单的方法来拥有 @987654321 @ 跳过这些文件?我尝试设置一个自定义的“静默”差异工具:

$ 猫 .git 属性 Project.xcodeproj/* diff=nodiff $ 猫 ~/.gitconfig [差异“nodiff”] 命令 = /bin/true

但是:

$混帐差异 外部差异死了,停在 Project.xcodeproj/zoul.mode1v3。

我做错了什么?

【问题讨论】:

    标签: git


    【解决方案1】:

    问题是/bin/true 将立即返回而不读取其输入。 git diff 因此认为,它已经过早死亡。

    您真正想要做的是取消设置 diff 属性,而不是将其设置为虚假命令。在您的.gitattributes 中试试这个:

    Project.xcodeproj/* -diff
    

    【讨论】:

    • 排除整个目录对我不起作用,因为许多文件位于更深的子目录中。相反, *.xcuserstate -diff 有助于忽略经常更改的文件。
    • 当然,只是想包含这个,因为它可能会帮助阅读本文的人解决他们的问题。
    • SO上类似的问题很多,找不到这么简单有效的答案!
    • 我正在使用 Git 1.9.4 并添加 -diff 现在使 diff 处理我想要作为二进制文件排除的文件,而不是忽略它们...
    • 如果你也想排除子目录,改成Project.xcodeproj/**/* -diff
    【解决方案2】:

    您可以在 .git/config 中使用别名

    [alias]
            mydiff = !git diff | filterdiff -x "*/Project.xcodeproj/*"
    

    这个技巧需要 filterdiff(来自 patchutils)。

    sudo apt-get install patchutils
    

    差异仍然不完美,它留下了一些垃圾:

    yannick@yannick-desktop:~/git-filter-test$ git mydiff
    diff --git a/Project.xcodeproj/dummy.txt b/Project.xcodeproj/dummy.txt
    index 3e1f9e6..89dfed9 100644
    diff --git a/dummy2.txt b/dummy2.txt
    index 91966ce..d9588a9 100644
    --- a/titi.txt
    +++ b/titi.txt
    @@ -1,3 +1,3 @@
     aaaaaaaaaa
    -bbbbbbbbb
     cccccc
    +ddd
    

    【讨论】:

    • 这很好,谢谢。垃圾还好,至少我知道那些文件变了。但是我失去了颜色,有没有办法让它回来?我试过 git diff --color 来强制它,但是 filterdiff 被颜色转义弄糊涂了并停止过滤。
    • 哦,是的,|色彩差异 |少 -r。
    • 感谢您对这个问题的回答——filterdiff 几乎可以满足我的需求——但是,剩余的“垃圾”给我带来了麻烦——有没有办法说“完全删除对文件”使用 filterdiff?
    【解决方案3】:

    另一种无需任何外部工具即可产生干净输出的解决方案(添加到.git/config):

    [alias]
        mydiff = !git diff -- $(git diff --name-only | grep -Ev "Project.xcodeproj/")
    

    然后运行它:

    git mydiff
    

    请注意git diff --name-onlygit ls-files 更好,因为它会将更短的文件列表传递给git diff,因为只会包含修改过的文件。在使用 git ls-files 时,我遇到了超出大型项目中最大参数数量的问题。

    【讨论】:

    • 我遇到了复杂路径的问题。我怀疑如果您使用 -z 开关会更好:“不要使用路径名并使用 NUL 作为输出字段终止符”。
    【解决方案4】:

    以防其他人有与我们一样的痛苦。 我们想排除一个已经提交的文件。

    这篇文章更有用: working with .git/info/exclude too late

    具体你需要忽略一个文件实际上是使用命令 git remove 请参阅 git rm (http://www.kernel.org/pub/software/scm/git/docs/git-rm.html)

    你去测试它

    git rm --dry-run *.log
    (如果你说要排除所有的日志文件)

    这将输出如果您运行它,将被排除

    然后

    你去运行它

    git rm *.log
    (或您想要的任何文件名路径/表达式)

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-04
      • 2020-02-15
      相关资源
      最近更新 更多