【问题标题】:How to Add Linux Executable Files to .gitignore?如何将 Linux 可执行文件添加到 .gitignore?
【发布时间】:2012-01-04 11:26:37
【问题描述】:

如何将 linux 可执行文件添加到 .gitignore 而不给它们显式扩展名并且不将它们放在特定或 /bin 目录中?大多数文件的名称与编译它们的 C 文件相同,没有“.c”扩展名。

【问题讨论】:

  • 这几乎是 stackoverflow.com/questions/5711120/… 的复制品。可以合并它们。
  • 不,可执行文件和二进制文件是有区别的。我认为需要忽略可执行脚本和二进制文件。我不认为这个问题是重复的。

标签: c++ c linux git gitignore


【解决方案1】:

除了源代码文件之外,你可以忽略所有文件吗?

例如:

*
!*.c
!Makefile

【讨论】:

  • 这会把婴儿和洗澡水一起扔出去。关于未跟踪文件的 git 警告的重点是您不会意外忘记 git add 新文件。通过将.c 文件和Makefile 列入白名单,现在很容易忘记.h 文件、READMEs 和其他可能很重要的文件。我会让.gitignore 文件更加保守,只添加您确定应该忽略的内容。
  • 虽然对我来说这个答案有效,但每个人都应该很好地理解@G.Sliepen 所指的内容。 .gitignore 的用途是将文件列入黑名单而不是白名单。
【解决方案2】:

我会明确地将它们放在项目 .gitignore 中。这并不优雅,但我想你的项目没有那么很多。

【讨论】:

  • 我偶然发现这个问题的原因正是因为它这么多。
【解决方案3】:

大多数开发人员通常在他们的项目中有一个build 目录,用于运行实际的构建过程。 所以,所有的可执行文件,.o.so.a 等都在那里,并且这个构建目录被添加到了.gitignore

【讨论】:

    【解决方案4】:

    我编写了一个脚本来自动将 ELF 可执行文件添加到.gitignore

    git-ignore-elf:

    #!/bin/sh
    set -eu
    cd "$(git rev-parse --show-toplevel)"
    file=.gitignore
    new=$file.new.$$
    (
    if [ -e "$file" ]; then
        cat "$file"
    fi
    find . -name .git -prune -o -type f ! -name '*.o' ! -name '*.so' \
        -print0 | xargs -0 file | grep ': *ELF ' | sed 's/:.*//' |
    sed 's,^./,,'
    ) | perl -ne 'print if !$already{$_}++' >"$new"
    mv "$new" "$file"
    

    特点:

    • 从顶级文件夹开始查找(可能是错误功能!)
    • 忽略 ELF 文件,不包括可以使用通用规则忽略的 .o 和 .so 文件
    • 保留 .gitignore 中的现有条目而不复制它们

    这个单脚本版本在这里:http://sam.nipl.net/b/git-ignore-elf-1

    这是一个更加模块化的版本,它依赖于同一个地方的其他脚本(git-root、find-elf、uniqo):http://sam.nipl.net/b/git-ignore-elf

    【讨论】:

    【解决方案5】:

    一种从当前目录中的所有可执行文件一次性生成与您的.gitignore 差异的方法:

    find . -perm /111 -type f | sed 's#^./##' | sort | diff -u .gitignore -
    

    这会产生差异,这意味着您不会丢失对文件的任何手动更改。这假设您的 .gitignore 文件已经排序。 sed 部分只是去掉 find 生成的前导 ./

    没有自动忽略可执行文件的方法,因此您总是需要人工管理文件。

    【讨论】:

      【解决方案6】:

      如果你碰巧有一个包含很多可执行文件的“项目”,例如,一个研究项目,其中有很多小练习被编译,你可以使用这个单行来更新你的 .gitignore:

      for f in $(find . -perm /111 -type f | grep -v '.git' | sed 's#^./##' | sort -u); do grep -q "$f" .gitignore || echo "$f" >> .gitignore ; done
      

      【讨论】:

        【解决方案7】:

        我也多次试图弄清楚这个问题。想分享一个长期坚持的解决方案。虽然我是从 Go 的角度来写这篇文章的,但除此之外我相信这是普遍适用的。

        首先,观察结果是典型项目中的可执行文件(和/或二进制文件)要少得多,然后是其他所有文件。此外,值得注意的是,将源文件显式标记为“不忽略”并忽略其他所有内容的方法效果不佳,因为我们希望我们的 cmets 和文本文件也被 git'ed。

        所以解决方案是制定一个约定,可执行文件有 .e 后缀,.gitignore 有 *.e。

        它很简单,而且效果很好。

        【讨论】:

        • 我认为它运作良好。虽然它是非标准的,并且不如将所有此类文件放在专用目录中的约定那样工作。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-14
        • 2014-04-30
        相关资源
        最近更新 更多