我能否让 "git status" 显示未跟踪文件的文件大小?

12

对我来说,查看未跟踪文件的文件大小以及更改文件的旧/新大小将非常方便。

是否可以配置git以显示这些信息?

6个回答

11
git status --porcelain | awk '{print $2}' | xargs ls -hs | sort -h
  1. git status --porcelain 会显示文件被修改。
$ git status
?? IMG_20160813_205506_AO_HDR.jpg
?? IMG_20160813_205539_AO_HDR.jpg
?? IMG_20160813_211139_HDR.jpg
?? IMG_20160814_143649_HDR.jpg
  1. awk '{print $2}' 将提取 ?? 之后的内容。
  2. 最后,ls -hs 将以人类可读的格式显示每个文件的大小,并且 sort -h 将按大小排序。
$ git status --porcelain | awk '{print $2}' | xargs ls -hs | sort -h
136 IMG_20160813_205506_AO_HDR.jpg
384 IMG_20160813_205539_AO_HDR.jpg
784 IMG_20160813_211139_HDR.jpg
5667898 IMG_20160814_143649_HDR.jpg

我得到了这个错误提示:"xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option"。在执行命令 "awk '{print $2}'" 后,输出的文本包含:"Assets/Editor(换行符)"Assets/Editor - Trong Nguyen
@TrongNguyen 可能是因为您的文件名中有空格或双引号导致出现这种情况。您需要修改命令以适应它。这里的命令符合大多数要求。 - ramwin
@TrongNguyen 可能是因为你的文件名中有空格或双引号导致的。你需要修改命令来适应它。这里的命令满足了大部分的要求。 - undefined

6
尝试将以下代码添加到您的.bashrc或.zshrc中。然后使用gst以带有文件大小信息的漂亮格式输出。
alias gst="git_status_size"
git_status_size(){
    git status --porcelain | awk '{print $2}' | xargs ls -hl | sort -r -h | awk '{print $5 "\t" $9}'
}

输出:

$ gst
287MB   video.mp4
53B     README.md
33B     222.txt
18B     333.txt
6B      111.txt

如果您已删除文件或未从存储库的根目录运行命令,则此脚本未经过优化。我已编辑此脚本以解决这两个问题:https://dev59.com/5FQJ5IYBdhLWcg3wCxa2#70792144 - fireball.1

5
不,你不能让git status这样做。
你可能不需要让git status这样做,因为你可以编写自己的命令来代替它。使用:
git -C "$(git rev-parse --show-cdup)" ls-files --other --exclude-standard

获取文件列表。然后,您可以使用任何命令查看这些文件的统计信息。您可能希望在git status之后立即运行此命令,并使用--untracked-files=no禁止git status列出它自己的内容。例如:

alias st='git status -uno;
  git -C "$(git rev-parse --show-cdup)" ls-files --others --exclude-standard -z | 
  xargs -0 ls -lR'

这里我使用了-z,因为我正在使用的命令xargs -0 ls -l可以处理它,并将其表示为一个shell别名而不是一个Git别名。

这里有一个缺陷。虽然git status-uall将枚举目录中的所有未跟踪文件,但git ls-files --others不会:它的行为类似于默认的git status,通过仅打印包含目录名称来总结这些文件。 在这里使用ls -l将显示目录中的文件。要停止这样做,请改用ls -ld,但是您当然看不到任何文件大小。

(要获取修改后的文件,请使用git ls-files -m而不是--others。)


0

以上所有答案都使用了git status --porcelain,它返回从存储库根目录开始的文件路径。

如果我们想要相对文件路径,则更喜欢使用git status -s。我编写了以下命令,仅显示存在的文件(已删除的文件不存在),并且可以在任何地方使用。

git status -s | grep -v D.* | awk '{print $2}' | xargs ls -hl | sort -r -h | awk '{print $5 "\t" $9}'

你也可以将以下内容添加到你的.bashrc文件中,以便用作别名。

alias gst="git_status_size"
git_status_size(){
        git status -s | grep -v D.* | awk '{print $2}' | xargs ls -hl | sort -r -h | awk '{print $5 "\t" $9}'
}

样例输出

7.8K    nnp_replication_attempt_1/scaling.data
7.8K    enhanced_sampling_1/scaling.data
5.3K    nvt_transfer_H_template.lmp
5.3K    ../replication_attempt_1/nvt_stretch_bond.lmp
719     enhanced_sampling_1/z1-ada.sh

0

这个对我有用:git status -s . | awk '{print $2}' | xargs ls -s M -S

解释

git

  • -s:使用当前目录作为参考而不是仓库根目录(这是 --porcelain 要求的内容)。
  • . 限制输出仅限于当前目录或以下的文件。

ls

  • -s M:以 MB 打印文件大小。
  • -Sls 的参数,它按大小排序输出并避免了需要使用 sort

0

这个命令可以处理包含空格的文件名。

git status --porcelain | awk '{print substr($0,4)}' | xargs ls -hs | sort -h

基于@ramwin的答案。

如果您的文件名称中有空格,运行ramwin的命令会出现错误“xargs:无法匹配双引号;默认情况下,引号对xargs来说是特殊符号,除非您使用-0选项”

我修改了awk部分为 awk '{print substr($0,4)}' ,substr($ 0,4)获取从git状态输出每行的第4个字符到末尾的文本。例如:

如果git状态--porcelain给出:?? "folder /带空格的文件夹/ fileA.ext"

awk'{print substr($0,4)}将输出"folder /带空格的文件夹/ fileA.ext"


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接