8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

Git 命令显示哪些特定文件被 .gitignore 忽略

faintsignal 1月前

160 0

我对 Git 有了初步了解,并遇到了以下问题:我的项目源代码树:/|+--src/+----refs/+----...|+--vendor/+----... 我的供应商分支中有代码(目前是 MEF),我需要

我正在尝试使用 Git 并遇到以下问题:

我的项目源代码树:

/
|
+--src/
+----refs/
+----...
|
+--vendor/
+----...

我的供应商分支中有一些代码(目前是 MEF),我将在那里进行编译,然后将引用移到 /src/refs 项目从中获取它们的地方。

我的问题是,我已将 .gitignore 设置设为忽略 *.dll *.pdb 。我可以执行 git add -f bar.dll 强制添加忽略的文件,这是可以的,问题是我无法弄清楚列出哪些文件被忽略。

我想列出被忽略的文件以确保我不会忘记添加它们。

我已阅读手册页 git ls-files ,但无法使其工作。在我看来,这 git ls-files --exclude-standard -i 应该可以满足我的要求。我遗漏了什么?

帖子版权声明 1、本帖标题:Git 命令显示哪些特定文件被 .gitignore 忽略
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由faintsignal在本站《git》版块原创发布, 转载请注明出处!
最新回复 (0)
  • (扩展其他答案)

    注意, git check-ignore 使用的是已提交的 .gitignore ,而不是工作树中的那个!为了不污染你的 git 历史记录,你可以自由地尝试编辑它,然后使用 git commit --amend .

    这个问题主要发生在你需要解决 git 不遵循目录的问题时。输入 .gitignore

    dirtokeep/**
    !dirtokeep/.keep
    

    .keep 应该是零长度文件 dirtokeep .

    结果是, 中的 所有内容 dirtokeep 都将被忽略, 除了 dirtokeep/.keep ,这将导致 dirtokeep 在克隆/签出时也构建目录。

  • JoSu 1月前 0 只看Ta
    引用 3

    假设有几个忽略目录,为什么不使用 \'git status node/logs/\' 来告诉您要添加哪些文件?在目录中我有一个不属于状态输出的文本文件,例如:

    在 master 分支上
    您的分支与‘origin/master’保持同步。
    未跟踪的文件:
    (使用 \'git add ...\' 来包含将要提交的内容)

        node/logs/.gitignore 
    

    .gitignore 是:

    *

    !.gitignore

  • 您可以使用 fd .

    运行的命令是:

    comm -23 <(fd -HI | sort) <(fd -H | sort) 
    

    请注意,如果没有 .git 目录而只有一个 .gitignore 文件(例如裸仓库),您必须具体说明 .gitignore 文件的位置。

    comm -23 <(fd -HI | sort) <(fd -H --ignore-file .gitignore | sort)
    

    更具体地说,使用 --no-ignore-vcs 而不是 -I

    欲了解更多详情,请点击 此处 .

  • 我会这么做

    git status --porcelain --ignored
    

    并仅列出被忽略的文件

    git status --porcelain --ignored | grep '^[!][!] '
    
  • Ryuu 1月前 0 只看Ta
    引用 6

    如果您只需要一个 有效的忽略文件列表 (无论它们是如何被忽略的),并且 不需要任何额外的通知和日志。

    创建后,在任何地方(在 Git-bash 中)运行:

    git ignore-list
    

    通过执行以下命令创建它:

    git config --global alias.ignore-list "! cd -- \"\${GIT_PREFIX:-.}\" && git ls-files -v \${1:-.} | sed -n -e \"s,^[a-z] \(.*\)$,\${GIT_PREFIX:-./}\1,p\" && git status --ignored --porcelain \${1:-.} 2>/dev/null | sed -n -e \"s/^\(\\!\\! \)\(.*\)$/\2/p\" #"
    

    使用示例, 假设这是初始提交并且您想要推送所有内容,请尝试:

    git ignore-list | xargs git add -f
    

    笔记:

    1. 它已经过测试并可在两个平台上 macOS 运行 Windows
    2. 一旦 cd 进入目录,仅列出该目录(或其子目录)忽略的文件。
    3. 最后,始终记录相对于根目录(包含 .git 目录,无论您 cd 进入哪个目录)的路径。

    另一个有用的东西是人性化,比如如果忽略整个目录,类似 build 或的 node_modules ,这将只记录目录名称。
    git ls-files --others -i --exclude-standard 命令会记录每一个文件(适合 xargs )。

  • 我猜你说的“适用于 Debian sid”是指“适用于 Debian sid 上默认安装的 Git 版本”?你真的应该避免被发行版中包含的实用程序版本所束缚。你可以独立于发行版本身升级它们。

  • 这对我来说从来没有用过,因为你必须手动列出这些文件。git status --ignored 在 Debian sid 上有效,但可能非常新...但显然它是由于大众需求而添加的;-)

  • 使用

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

    因为这涵盖了

    git ls-files --others -i --exclude-from=.git/info/exclude
    

    因此后者是多余的。


    You can make this easier by adding an alias to your ~/.gitconfig file:
    git config --global alias.ignored "ls-files --others -i --exclude-standard"
    

    现在您只需键入即可 git ignored 查看列表。更容易记住,输入也更快。

    如果您更喜欢 Jason Geng 解决方案的更简洁展示,您可以为其添加一个别名,如下所示:

    git config --global alias.ignored "status --ignored -s"
    

    但是,更详细的输出对于解决 .gitignore 文件的问题更有用,因为它列出了每个被忽略的奇怪文件。您通常会通过管道传输结果, grep 以查看您希望被忽略的文件是否在其中,或者您不想被忽略的文件是否在其中。

    git ignored | grep some-file-that-isnt-being-ignored-properly
    

    然后,当你只想看一个简短的显示时,很容易记住并输入

    git status --ignored
    

    -s 通常可以将其关闭。)

  • 非常感谢!我一直在努力弄清楚为什么我的一些新源文件偶尔会从我的提交中丢失。原来我有一个模式:bin*,我以为它只会匹配以 bin 开头的文件/目录名称,但它却匹配文件/目录完整路径中包含 bin 的任何内容!我猜,我的问题来自于对 .gitignore 中模式匹配的精确语义的误解。您的 2 行脚本帮助我发现了这个错误!

  • 下面介绍了如何打印工作树中与 Git 的多个 gitignore 源中任何位置的模式匹配的文件的完整列表(如果您使用 GNU find ):

    $ cd {your project directory}
    $ find . -path ./.git -prune -o -print \
    | git check-ignore --no-index --stdin --verbose
    

    它将检查存储库当前分支中的所有文件(除非您已在本地删除它们)。

    并且它还识别特定的 gitignore 源代码行。

    Git 会继续跟踪与 gitignore 模式匹配的某些文件的更改,因为这些文件已被添加。有用的是,上述命令也会显示这些文件。

    负面的 gitignore 模式也会被匹配。然而,这些在列表中很容易区分,因为它们以 ! .

    如果您使用的是 Windows, Git Bash 包含 GNU find (由 揭示 find --version )。

    如果列表很长(并且你有 rev ),你也可以通过扩展(某种程度上)显示它们:

    $ cd {your project directory}
    $ find . -path ./.git -prune -o -print \
    | git check-ignore --no-index --stdin --verbose \
    | rev | sort | rev
    

    有关详细信息,请参阅 man find , man git-check-ignore , man rev man sort .

    整个方法的重点是 Git(软件)变化很快,而且非常复杂。相比之下,GNU find 非常都会以不同的方式回答这个问题。

    最佳答案是什么?答案刻意将对 Git 知识的依赖降到最低,通过模块化(信息隔离)实现稳定性和简单性的目标,并旨在持久 使用

  • 遗憾的是,内置功能不是人类可读的,例如,它列出了 vendor 和 node_modules 目录中的所有内容,请参阅我的回答以了解人类可读的版本:.com/a/66922010/8740349

  • pix 1月前 0 只看Ta
    引用 13

    Git 现已内置此功能

    git check-ignore *
    

    当然,你可以将 glob 更改为类似于 **/*.dll 你的情况

    Git 参考

  • 这会一次性完成所有操作,并扩展目录:(git ls-files -oi --exclude-standard; git ls-files -oi --exclude-standard --directory)| perl -nle '$seen{$_}++||next;if(-d){system\'find\',$_,\'-type\',\'f\'}else{print}'

  • 这给了我想要的东西,而其他的则没有(对于我的特定情况)...谢谢!必须运行两个命令真是令人沮丧,但是对于一个被忽略的目录,--directory 选项至少可以找到它,我可以将其输入到 find 命令中来查找文件。谢谢!

  • 虽然您的解决方案通常是正确的,但并不在所有情况下都有效。假设 repo 目录如下:

    # ls **/*                                                                                                       
    doc/index.html  README.txt  tmp/dir0/file0  tmp/file1  tmp/file2
    
    doc:
    index.html
    
    tmp:
    dir0  file1  file2
    
    tmp/dir0:
    file0
    

    以及像这样的 .gitignore:

    # cat .gitignore
    doc
    tmp/*
    

    这会忽略 doc 目录和其下的所有文件 tmp 。Git 按预期工作,但是给出的列出忽略文件的命令却没有。让我们看看 git 是怎么说的:

    # git ls-files --others --ignored --exclude-standard                                                            
    tmp/file1
    tmp/file2
    

    请注意, doc 列表中缺少了它。您可以通过以下方式获取它:

    # git ls-files --others --ignored --exclude-standard --directory                                                
    doc/
    

    注意附加 --directory 选项。

    据我所知,没有 一个 命令可以一次列出所有被忽略的文件。但我不知道为什么 tmp/dir0 根本没有显示。

  • @José 如果指定了 n,则 f 无效。git clean -nxd,如果您对它将删除的内容感到满意,那么 git clean -fxd 会真正删除文件

  • @TobiasCohen 很好!我根据你的建议更新了答案。这样更安全。但是,如果你省略 n,Git 默认为致命:clean.requireForce 默认为 true,并且没有给出 -n 和 -f;拒绝清理。仍然很安全,但先输入 n 更安全!:)

  • 引用 19

    一件小事 - 先输入 n 可能是一个好主意,这样意外删除的机会就更少了;git clean -ndX

  • 我使用的是 git 版本 1.7.0.4,两个命令(“git ls-files -o -i --exclude-standard”,“git clean -dXn”)不等效。第一个命令显示 4 个文件,第二个命令只显示 2 个文件。(.gitignore~、index.php~、sql/create_users.sql~、www/index.php~)(将删除 .gitignore~,将删除 index.php~)。我是不是漏掉了什么?

返回
作者最近主题: