gitignore按文件大小?

War*_*tto 45 git configuration blob gitignore large-files

我正在尝试实施Git来管理创意资产(Photoshop,Illustrator,Maya等),我想根据文件大小而不是扩展名,位置等从Git中排除文件.

例如,我不想排除所有.avi文件,但在随机目录中有一些大量的+ 1GB avi文件,我不想提交.

有什么建议?

小智 41

我是.gitignore的新手,所以可能有更好的方法来做到这一点,但我一直在使用以下文件大小排除文件:

find . -size +1G | cat >> .gitignore
Run Code Online (Sandbox Code Playgroud)

显然,如果要生成大量大文件,则必须经常运行此代码.

  • 你们都赢得了"无用的猫奖". (9认同)
  • 为避免存储重复的文件名:`find.-size + 1G | sed's | ^\./ || g'| 猫>> .gitignore; awk'!NF || 见过[$ 0] ++'.gitignore`.`sed`将摆脱尾随`./`,'awk`将通过检查一行中存在的字段数(`NF`)来删除所有重复的行,忽略空行 - 如果你的`.gitignore`这很有用.由空行分隔的部分组织. (6认同)
  • 我发现在gitignore工作之前我需要从每个文件的开头删除前导的`./` (5认同)
  • 这是一个非常古老的线程,但万一有人偶然发现它需要一个可行的解决方案:`找到.-size + 1G | sed's | ^\./ || g'| 猫>> .gitignore` (3认同)

use*_*745 15

要满足 github <100MB 文件限制,请运行以下命令:

find . -size +100M | cat >> .gitignore
Run Code Online (Sandbox Code Playgroud)

  • 在 Windows 中,运行相同的命令,它可能会将 `./` 添加到每个路径的开头,如下所示 `./android/app/build/outputs/apk/debug/app-universal-debug.apk` 。删除`./`如下解决了我的问题;`android/app/build/outputs/apk/debug/app-universal-debug.apk` (2认同)

and*_*lle 9

尽管文件大小非常大,并且以下内容根本不是问题,并且只要@abendine 答案正确,根据:https ://stackoverflow.com/a/22057427/6466510

find * -size +1G | cat >> .gitignore
Run Code Online (Sandbox Code Playgroud)

会好得多。也看看这个:find 之间的区别。并找到*在UNIX事实证明,更换.*此之上,避免在物质中找到.git的目录。


tis*_*rum 6

我也想提供一个 Windows 版本。

forfiles /s /c "cmd /q /c if @fsize GTR 1073741824 echo @relpath" >> .gitignore
Run Code Online (Sandbox Code Playgroud)


ear*_*zon 6

(2020 年 5 月更新)

Microsoft 不久前发布了开源的 Git-LFS。也许这就是大多数人真正正在寻找的:

https://git-lfs.github.com/ 项目页面的 C&P:“Git Large File Storage (LFS) 用 Git 内部的文本指针替换音频样本、视频、数据集和图形等大型文件,同时存储文件GitHub.com 或 GitHub Enterprise 等远程服务器上的内容。”


KIC*_*KIC 5

我想添加到所有这些答案中,您也可以使用 git hook 来获得更自动化(或更少人为错误)的东西,如下所示:

cat .git/hooks/pre-commit

#!/bin/bash

echo "automatically ignoring large files"
find . -size 5M | sed 's|^\./||g' >> .gitignore
cat .gitignore | sort | uniq > .gitignore

git diff --exit-code .gitignore
exit_status=$?
if [ $exit_status -eq 1 ]
then
    set +e
    for i in `cat .gitignore`
    do
    set +e
        git rm --cached $i
    done

    git add .gitignore
    git commit .gitignore --no-verify -m"ignoring large files"

    echo "ignored new large files"
fi
Run Code Online (Sandbox Code Playgroud)

这是相当蛮力的,缺点是如果 git hook 添加了新的大文件,原始提交会失败,因为状态(哈希)发生了变化。因此,您需要执行另一次提交来实际提交您已暂存的内容。将此视为一个功能,告诉您检测到新的大文件;-)