【问题标题】:How to get ONLY filename with path using git log?如何使用 git log 仅获取带有路径的文件名?
【发布时间】:2023-04-04 06:13:02
【问题描述】:

我几乎使用了所有 git log 命令,但我还没有找到最好的方法来做到这一点。我只需要这个 - 只获取带有路径的文件名

/path/filename.txt
/path/anotherfile.ext
...
...

我的输入是 git log 命令的日期 FROM 和 TO。 git log 提供开发人员名称或日期或提交编号或我不想要的文件名。如何仅获取具有完整路径的文件名?

【问题讨论】:

    标签: git github git-log


    【解决方案1】:

    使用--name-only 并删除格式为空的消息

    git log --name-only --format=""
    

    像往常一样使用所有其他git log 选项。例如。

    git log --name-only --format="" -n 2 master
    

    可选择排序和删除重复项

    git log --name-only --format="" | sort | uniq
    

    【讨论】:

    • 我突出显示了“ONLY file-name with path”这个短语。
    【解决方案2】:

    使用--since 和--until 选项选择时间范围,然后您可以使用UNIX 管道到grep、sort 并收集uniqe 路径:

    git log --name-status --since='..' --until='..' | grep -E '^[A-Z]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'
    

    例子:

    git log --name-status --since='1 January 2015' --until='2 January 2015' | grep -E '^[A-Z]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'
    

    更详细的git log输出见How to have git log show filenames like svn log -v


    如果您有两个提交哈希,您也可以改用 git diff 和 --name-only,正如另一个答案提到的那样:

    git diff hash1..hash2 --name-only
    

    【讨论】:

    • 我做了你上面展示的更简单的术语,比如 "git log --pretty=format: --name-status" 。是的,这仅给出文件名,但它会在文件名之前的每一行的开头添加修改状态 A、M、D 等。这就是为什么我只提到带有路径的文件名!任何解决方法..??
    • @flute 知道了!最后你只需要一些sed 魔法(见编辑):... | sed -e 's/^\w\t*\ *//'
    • 你是魔术师吗?你“诱惑”了 git log 来做这件事!!它有效!
    • @flute 是的,Node.js 和 UNIX 黑魔法师。 :D UNIX 管道很棒,不是吗?很高兴我能帮上忙!
    • 我有一个 Python,可以使用!这些魔法对它不起作用。 cmd = ["git", "log --name-status | grep -E '^[AZ]\b' | sort | uniq | sed -e 's/^\w\t*\ *//'"] subprocess.call(cmd)。这在 python 脚本中给出错误 - 说“命令无效或其他东西”。可能是因为我用的是windows机器。
    【解决方案3】:

    这不使用git log,但如果你愿意使用提交对象(散列、分支引用或其他提交标识符),git diff 使它变得简单。获取最后三个提交的更改文件的示例。

    $ git diff HEAD~3 --name-only
    > some/path/with/file.php
    > another/path/and/file.html
    > yet/another.json
    

    您可以将 HEAD~3 替换为单个提交,以便与当前 HEAD(您“打开”的提交)进行比较,或者然后使用 <commitish>..<commitish> 定义提交范围:

    $ git diff HEAD..abcd1234 --name-only
    > file/name/here.cpp
    
    $ git diff 1234abcd..abcd1234 --name-only
    > some/file/name-here.txt
    

    如果您需要根据修改类型(例如添加、修改、删除...)过滤文件,您可以使用--diff-filter 选项。 man git diff:

    --diff-filter=[(A|C|D|M|R|T|U|X|B)...[*]]
           Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R), have their type (i.e. regular file, symlink, submodule, ...) changed (T), are
           Unmerged (U), are Unknown (X), or have had their pairing Broken (B). Any combination of the filter characters (including none) can be used. When * (All-or-none) is added
           to the combination, all paths are selected if there is any file that matches other criteria in the comparison; if there is no file that matches other criteria, nothing
           is selected.
    

    如果您需要使用日期进行过滤,那么这可能不是最佳选择。也许使用git log --since=... 获取日期的第一个哈希并将其传递给git diff?

    【讨论】:

      猜你喜欢
      • 2015-09-19
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2015-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多