如何添加Linux可执行文件到.gitignore

How to Add Linux Executable Files to .gitignore?

本文关键字:Linux 可执行文件 gitignore 添加 何添加      更新时间:2023-10-16

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

可以忽略除源代码以外的所有文件吗?

例如:

*
!*.c
!Makefile

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

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

我编写了一个脚本来自动将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

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

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

生成一个diff,这意味着您不会丢失对文件的任何手动更改。这假设您的.gitignore文件已经排序。sed部分只剥离find生成的前导./

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

忽略所有c/c++可执行文件将此保存在.gitignore文件中,这会忽略所有没有文件扩展名的文件,因为linux中通常没有c/c++可执行文件的文件扩展名

*
!*.*
!*/

如果你碰巧有一个"项目";对于相当多的可执行文件,例如,一个研究项目中有许多小的练习需要编译,您可以使用以下单行代码来更新.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

所有未跟踪和未忽略的文件或存储库:

git ls-files --others --exclude-standard

可执行文件:

find -type f -executable 

将所有未跟踪的未忽略的文件添加到.gitignore:

git ls-files -z --exclude-standard --others 
| find -files0-from /dev/stdin -type f -executable > new.$$
[ -s new.$$ ] && ( cat new.$$ >>.gitignore; rm new.$$; git add .gitignore )

或者真的,试着不要把事情弄得一团糟。

将可执行文件放在bin/中,然后完成它。

我也曾多次试图弄清楚这个问题。我想分享一个长久有效的解决方法。虽然我是从Go的角度写的,但我相信这是普遍适用的。

首先,观察到的是,在典型的项目中,可执行文件(和/或二进制文件)比其他文件少得多。另外,值得注意的是,将源文件显式标记为"不忽略",并忽略其他所有内容的方法并不能很好地工作,因为我们希望我们的注释和文本文件,例如,也被git。

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

我不知道,你可以添加一个或两个规则,在Makefile;比如:

$(TARGET): $(TARGET).o
    $(CC) -ggdb -o $@ $^
    @grep $@ .gitignore > tmp || true
    @[ -s tmp ] || echo $@ >> .gitignore; rm tmp
如果.gitignore文件不存在,它将把可执行文件附加到.gitignore文件中。

这可能有帮助:

file * | sed -n '/text/d;/exec/s/^(.*):.*/1/p'

基本上它搜索所有非文本文件的可执行文件,因此是二进制文件。如果需要ELF二进制文件,它可以是这样的:

file * | sed -n '/text/d;/ELF.*exec/s/^(.*):.*/1/p'

并将结果放入。gitignore