【问题标题】:Git: list only "untracked" files (also, custom commands)Git:仅列出“未跟踪”文件(还有自定义命令)
【发布时间】:2011-04-17 14:39:05
【问题描述】:

有没有办法使用像git ls-files 这样的命令来只显示未跟踪的文件?

我问的原因是因为我使用以下命令来处理所有已删除的文件:

git ls-files -d | xargs git rm

对于未跟踪的文件,我想要类似的东西:

git some-command --some-options | xargs git add

我能够找到git ls-files-o 选项,但这不是我想要的,因为它也显示被忽略的文件。我还能够想出以下长而丑陋的命令:

git status --porcelain | grep '^??' | cut -c4- | xargs git add

看来我可以在这里使用更好的命令。如果没有,如何创建自定义 git 命令?

【问题讨论】:

  • 能否详细说明为什么需要git ls-files -d | xargs git rm
  • 删除所有 git 通知丢失的文件。我的问题是关于如何进行相关操作 - 添加 git 当前未跟踪的所有文件。我通常会在重命名、合并和/或拆分我的代码文件后同时执行这两项操作。
  • 如果它们丢失了,那么它们不是已经被删除了吗?除非...您从其他地方拉出然后您尝试与远程同步...我想我明白了。
  • 我已经测试了所有答案,如果有空的未跟踪文件夹,没有人可以找到它。
  • @kittygirl 这是正确的。因为git 仅适用于文件,所以它无法跟踪空文件夹。请改用find . -type d -empty

标签: git git-status git-rm git-stage git-ls-files


【解决方案1】:

git add -A -n 会做你想做的事。 -A 将所有未跟踪的和已修改 文件添加到 repo,-n 使其成为 dry-run,其中未执行添加但给出的状态输出列出了 将要执行的每个文件 已添加。

【讨论】:

  • 这是一个很好的答案!请注意,它排除了.gitignore 文件中的文件,这通常是我们想要的,但如果不是,git add -fAn
  • 这似乎是最好的答案。
  • 这是最好的答案。它明确地告诉用户它会做什么(不做),并在实际添加它之前有机会对其进行审查。完美的。谢谢!
  • 它还列出了修改过的文件。
  • 很好,但我把它包装好了:add '$file'。而git ls-files --exclude-standard -o 给出了一个裸露的输出,管道很热。
【解决方案2】:

我认为这将与原始海报的意图相同:

git add .

添加一些注意事项:

  • 您已运行 git status 并确认您的本地目录是干净的
  • 您已对git status 中报告的每个文件运行git diff,并确认您的更改是干净的
  • 自动化单元测试涵盖您的更改
  • 自动化集成测试涵盖您的更改
  • 您已通过调试器运行集成测试,通过白盒观察新代码的运行情况来验证新行为
  • 您已运行所有 linting/代码约定规则并且它们通过了
  • 您已运行所有单元测试并且它们通过了
  • 您已运行所有本地集成测试,并且它们通过了
  • 您已将更改部署到应用审核环境并在与其他更改隔离的情况下对它们进行端到端手动测试
  • 您已从主分支合并最新并重新运行所有自动化单元和集成测试,修复任何合并冲突和测试失败

现在,我的朋友,你准备好 git add . 不受惩罚了。

【讨论】:

  • 每执行一次git/svn add .,小猫就会死去。
  • 嘿,只有当你的远程分支的本地副本中有一堆杂物时;) 建立本地分支,你可以 git add . 不受惩罚!
  • @Nakilon,这就是您正确配置.gitignore 的原因。不过,避免git add . 还是不错的。更好的是git add -u
  • 嘿,很长时间了@Nakilon 和@Wildcard。为了清楚起见,更新了答案,肯定有一些关于开发人员工作流程的假设会影响git add . 的安全使用。
  • 不是我的反对意见。不错的清单。这表明您无论如何都需要做很多事情以确保您做对了事情,这就是为什么以比git add . 更精确的方式暂存文件不应该被认为是乏味的事情。那是我的观点。 2013 年?糟糕的是事情并没有真正改变——人们仍然在这样做,这就是有拉取请求和代码审查的不明显但真实的一半原因。就像一个战斗的症状。否决票可能是因为您还必须在此之前执行git checkout . 才能不添加更改。
【解决方案3】:

我检查过的所有以前的答案也会列出要提交的文件。 这是一个简单易用的解决方案,它仅列出尚未包含在 回购,不受.gitignore的约束。

git status --porcelain | awk '/^\?\?/ { print $2; }'

git status --porcelain | grep -v '\?\?'

【讨论】:

  • 这似乎不适用于名称中有空格的文件
【解决方案4】:

我知道这是一个老问题,但在列出未跟踪文件方面,我想我会添加另一个也列出未跟踪文件夹的文件:

您可以使用带有 -n(试运行)的 git clean 操作来显示它将删除哪些文件(包括 .gitignore 文件):

git clean -xdn

这样做的好处是可以显示未跟踪的所有文件所有文件夹。参数:

  • x - 显示所有未跟踪的文件(包括被 git 和其他人忽略的文件,例如构建输出等...)
  • d - 显示未跟踪的目录
  • n - 最重要的是! - 干运行,即实际上不删除任何内容,只需使用清理机制来显示结果。

如果您忘记了-n,这样做可能有点不安全。所以我通常在 git config 中给它起别名。

【讨论】:

  • 为什么 git 输出的可读性如此令人讨厌?建议的答案会在每个文件名之前打印“将删除”,因此如果没有进一步的 grepping,它就不能用于 OP 的用例。
【解决方案5】:

接受的答案在带有空格的文件名上崩溃。我现在不确定如何更新别名命令,所以我将改进版本放在这里:

git ls-files -z -o --exclude-standard | xargs -0 git add

【讨论】:

  • 我认为这是正确的答案,因为它提供了每个文件的路径,以便之后对它们执行操作(如 git add)
【解决方案6】:

要列出未跟踪的文件,请尝试:

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

如果您需要将输出通过管道传输到xargs,最好注意使用git ls-files -zxargs -0 的空格:

git ls-files -z -o --exclude-standard | xargs -0 git add

添加未跟踪文件的好别名:

au = !git add $(git ls-files -o --exclude-standard)

编辑:供参考:git-ls-files

【讨论】:

  • 完美!别名行开头的! 是什么意思,或者记录在哪里?
  • @takeshin 如何仅获取父目录名称?不是子文件夹。在这些未跟踪的文件中表示: /P/a/files , /P/a/images , /P/a/ /P/ ,... - 我只想列出 /P/
  • 在什么情况下你需要别名呢? git add * 会做同样的事情:添加除标准之外的所有未跟踪文件(文件的路径包含在 .gitignore 中)。
  • 我更喜欢我的别名在 repo 的所有目录中始终如一地工作(ls-files 命令只显示当前树中更改的文件),所以我有[alias] lso = "!f() { cd $(git rev-parse --show-toplevel); git ls-files -o; }; f"
  • @takeshin,它是否包含 git-lfs 跟踪的文件?
【解决方案7】:

一切都很简单

要获取所有未跟踪文件的列表使用命令 git status选项 -u (--untracked -文件)

git status -u

【讨论】:

  • 非递归版本怎么样?
  • 不幸的是,它还列出了通过 .gitignore 文件忽略的文件。
  • 这是在初始提交时显示我忽略的文件的唯一答案,但我必须将 --ignored 添加到 git status -u 命令
  • 这个显示修改过的文件。所以,不是问题的答案:only 显示未跟踪的文件。
  • 这也会在实际文件列表之前输出额外的行,例如On branch ...Untracked files:(use "git add <file>..." to include in what will be committed),以及在实际文件列表之后输出nothing added to commit but untracked files present (use "git add" to track) - 如果要使用输出,则必须将其删除作为另一个命令的输入
【解决方案8】:

在寻找可能添加的文件时。 git show 的输出可以做到这一点,但它还包含许多其他内容。以下命令可用于获取相同的文件列表但不包含所有其他内容。

 git status --porcelain | grep "^?? " | sed -e 's/^[?]* //'

当在管道中组合以查找与特定模式匹配的文件并将其通过管道传输到 git add 时,这很有用。

git status --porcelain | grep "^?? "  | sed -e 's/^[?]* //' | \
egrep "\.project$|\.settings$\.classfile$" | xargs -n1 git add

【讨论】:

    【解决方案9】:

    如果您只想删除未跟踪的文件,请执行以下操作:

    git clean -df
    

    如果您还想包含特别忽略的文件,请添加x。我一整天都在使用git clean -dfx 很多

    您只需编写一个名为 git-whatever 的脚本并将其放在您的路径中,即可创建自定义 git。

    【讨论】:

    • 我想添加所有未跟踪的文件(例如,在我移动一些东西之后)更为常见。无论如何,感谢有关自定义命令的提示。该机制记录在哪里?
    • 只要git add -Agit add -u(取决于哪个对你更有意义)
    • 和 "git clean -dfxn" 通过添加 "n" 进行试运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    • 1970-01-01
    • 2015-04-06
    • 2021-09-12
    • 2018-07-21
    • 2019-04-20
    相关资源
    最近更新 更多