【问题标题】:How to git blame a directory如何git责备一个目录
【发布时间】:2015-12-14 05:14:34
【问题描述】:

我想知道如何使用 git blame 来知道谁创建了单个目录。

当我尝试时:

git blame DIRECTORY_NAME

我明白了:

fatal: no such path DIRECTORY_NAME in HEAD

顺便说一下,目录是空的。有什么建议吗?

【问题讨论】:

  • 空目录不会添加到 git 的仓库中,因此会出现消息。向文件夹中添加一些内容,提交,然后重试。
  • 这让我想起了“tree blame”(RFC 2009:git.661346.n2.nabble.com/…)和 git blame tree(2011:spinics.net/lists/git/msg152620.html)。 2 个 RFC 无处可去。
  • 尝试 [ git log --follow "directory" ] 它会给你所有的日志,即使目录被重命名/删除/修改。
  • @MadPhysicist 感谢您的建议,但该命令对非空目录返回相同的消息。

标签: git


【解决方案1】:

尝试仅获取该目录的日志,并使用 -p 选项查看发生的确切更改。

$ git log -p <path to directory>

这可能仍然无法准确告诉您是谁创建了该目录,因为 git 似乎更关注文件内容,但您可能会从第一次看到任何内容添加到其中时获得一些有用的线索。

【讨论】:

    【解决方案2】:

    我创建了一个小函数,它遍历所有文件并创建类似于 GitHub 的目录责备视图。

    输出格式为:

     FILENAME      COMMIT-HASH  Commit-DATE  AUTHOR  COMMIT-MESSAGE
    

    看起来像这样

     myfile1    abceeee 2019-04-23 19:26  Radon8472  Added file example
     readme.md  abd0000 2019-04-24 19:30  Radon8472  Update Readme-File
    
    blamedir() 
    { 
      FILE_W=35; 
      BLAME_FORMAT="%C(auto) %h %ad %C(dim white)%an %C(auto)%s"; 
    
      for f in $1*; 
      do 
        git log -n 1 --pretty=format:"$(printf "%-*s" $FILE_W "$f") $BLAME_FORMAT" -- $f; 
      done; 
    }; 
    

    用法示例:

    • blamedir 类似 blamedir ./
    • blamedir DIRECTORY_NAME/

    通过更改函数中的变量BLAME_FORMAT,随意更改显示格式。

    我认为应该可以将此功能设置为git-alias。

    【讨论】:

    • 这个很简洁但是我建议在git命令中加上--no-pager,后面加上echo,不然体验有点差。不知何故,这个 git 命令的输出甚至不包含换行符。
    • --no-pager 标志可能很有用。但我不明白为什么你的输出中没有换行符,这很奇怪
    • 也许我的 git 版本真的接受了--pretty=format:...
    【解决方案3】:

    git blame当前目录:

    git ls-files -z | xargs -0n1 git blame
    

    我从这里改编了上面的内容:https://gist.github.com/Alpha59/4e9cd6c65f7aa2711b79

    一个非常非常慢的单行程序,它通过 git blame 并查看每个作者贡献了多少行。

    看来我需要按空格键和 Q 至少一次才能完全滚动列表。

    【讨论】:

    • 我必须在两个命令中添加--no-pager 以使其更快地运行git --no-pager ls-files -z | xargs -0n1 git --no-pager blame
    • @Ivan 这是一个很好的改进;但它指出了ls-files 的一个有趣的特性/缺陷,即它递归到子目录中。所以我尝试在一个大仓库上运行你的命令git --no-pager ls-files -z | xargs -0n1 git --no-pager blame,但过了一会儿,MacOS 终端损坏了!这些角色开始看起来像是来自《黑客帝国》的东西。也许该解决方案可以调整为不使用以下方法递归到子目录:stackoverflow.com/questions/10452962/…
    猜你喜欢
    • 2021-07-29
    • 2011-06-06
    • 2011-05-23
    • 2017-04-17
    • 2016-04-21
    • 2013-03-02
    • 2011-07-03
    • 2015-09-21
    相关资源
    最近更新 更多