如何按名称列出包含文件的所有提交

时间:2018-07-30 07:57:50

标签: git

我想知道所有包含(不仅更改)特定文件的提交。

我尝试过的是:

git rev-list --all -- .gitmodules
git log --all --pretty="%H" -- .gitmodules

这些命令仅显示那些已修改特定文件的提交。我也对那些在树中包含未修改文件的提交感兴趣。

我想用它来进一步分析那些提交,以创建子模块使用情况报告。

2 个答案:

答案 0 :(得分:0)

一种可能性是创建一个脚本,该脚本列出目录中每个文件的提交:

# !/bin/bash 

for f in `ls -f` 
    do 

    # Var colors
    resaltBlue=$'\033[47m\033[2;34m'
    res=$'\033[0m'
    # Print the file where you will get your commits
    echo -e "$resaltBlue Archive : $f $res"
    # Print the commit in oneline
    git log --oneline "$f"
done

输出:

Output

该脚本可以根据用户的需要进行改进。

答案 1 :(得分:0)

  

这些命令[git loggit rev-list在给定文件名时仅显示那些修改了特定文件的提交。我也对那些在树中包含未修改文件的提交感兴趣。

在这种情况下,您将要编写自己的程序,可能是Shell脚本。

git rev-list开始,因为它是编写Git脚本的通用管道程序。如您所见,默认情况下,git rev-list的输出仅为每行一个原始哈希ID。这些是提交的哈希ID:

  • reachable from命令行参数,和
  • 选择了您包含的所有约束。 (文件名将输出限制为普通的非合并提交,其中,该提交中包含的文件与该提交的父文件中的文件不同-正是您不需要想要的。)

因此git rev-list --all查找所有引用都可访问且没有任何约束的提交,并列出所有这些哈希ID。现在,您需要做的只是保留文件所在的提交,而放弃文件不存在的提交。通过脚本执行此操作的最简单方法是:

git rev-list --all | while read hash; do
    if git rev-parse --quiet --verify $hash:.gitmodules >/dev/null; then
        echo $hash # file .gitmodules exists in $hash
    # else
    #   file .gitmodules does not exist in $hash
    fi
done