V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
erquiasz0825
V2EX  ›  git

求助一个 git 命令

  •  
  •   erquiasz0825 · 324 天前 · 2086 次点击
    这是一个创建于 324 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我需要一个 git 命令,做到如下事情:

    1. 可以查看某个人的 git 文件改动记录
    2. 对于同一个文件的多次改动,把最终的改动汇总到一起展示
    3. 用一条命令,而不是多条

    例如:

    git log --author=jack --since=2023-12-16 --until=2023-12-31 -p
    

    这条命令,会显示 jack 每次提交的改动,如果 xxx.go 文件有多次修改,会显示每次的改动记录,而不是只显示最终的改动对比,这样也是不行的。

    16 条回复    2024-01-03 11:35:26 +08:00
    ltycn
        1
    ltycn  
       324 天前
    你可以使用以下命令来查看某个人在指定时间范围内对某个文件的改动,并将多次改动汇总展示:


    git log --author=jack --since=2023-12-16 --until=2023-12-31 --follow -- xxx.go


    这条命令中的关键部分是 `--follow`,它告诉 Git 在文件改名或移动时一直跟踪文件的历史。然后通过指定文件名 `xxx.go`,你只会看到该文件的改动记录。

    请注意,如果文件在某个提交中被重命名,`--follow` 选项可以帮助你继续跟踪该文件的历史。但如果文件在多个提交中被删除和新建,`--follow` 可能无法完全跟踪,你可能需要手动检查这种情况。

    CHATGPT 回答,仅供参考
    erquiasz0825
        2
    erquiasz0825  
    OP
       324 天前
    @ltycn 谢谢,在提问之前我也问过 chatgpt ,你只是替我问了 chatgpt ,都没有看看符不符合需求
    erquiasz0825
        3
    erquiasz0825  
    OP
       324 天前
    还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。
    SculptureSand
        4
    SculptureSand  
       324 天前 via Android
    @ltycn
    下次别贴 AI 内容了,违反站规的
    xiangyuecn
        5
    xiangyuecn  
       324 天前
    用图形界面都不需要思考
    yolee599
        6
    yolee599  
       324 天前
    @ltycn #1 别贴 ChatGPT 内容了,别站长看到必 ban 账号
    laokiea
        7
    laokiea  
       324 天前
    对于同一个文件的多次改动,把最终的改动汇总到一起展示

    需要过滤其他用户对同一个文件同一个部分的修改?
    erquiasz0825
        8
    erquiasz0825  
    OP
       324 天前
    @laokiea 只要指定作者的修改
    ltycn
        9
    ltycn  
       324 天前
    抱一丝各位,我寻思这么简单的问题 CHATGPT 问一下子就有结果来着。
    你这个需求的表达就有问题,,,
    对于同一个文件的多次改动,把最终的改动汇总到一起展示
    我是不是可以理解为:固定时间间隔内指定作者的改动,只取头尾 commit ,再做对比
    这不就很清楚了么

    git diff $(git log --author=jack --since=2023-08-16 --until=2023-12-31 --reverse | head -n 1 | awk '{print $2}') $(git log --author=jack --since=2023-08-16 --until=2023-12-31 | head -n 1 | awk '{print $2}') -- xxx.go

    这段代码也是 GPT 给我的,我试过了没问题。
    如果 GPT 不能满足你的要求,说明你的提问方式有问题
    rrfeng
        10
    rrfeng  
       324 天前
    最终变动肯定是 diff
    先用 log --author 找出来,然后 diff start..end xxx.go 完事

    但是 diff 不可能分 author 的。
    yechentide
        11
    yechentide  
       324 天前
    OP 语气有点冲啊
    下面的脚本压缩为一行就行了

    ```shellscript

    declare -r REPO_ROOT='/tmp/xxx'
    declare -r AUTHOR='[email protected]'
    declare -r START_DATE='2023-01-01'
    declare -r END_DATE='2024-01-01'

    while IFS='' read -r file; do
    echo ">>>>>>>>>> $file"
    echo ''

    # 区分同一个文件的不同 commit
    # git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"%H" -- "$file" \
    # | xargs -I{} git -C $REPO_ROOT show --color=always {} -- "$file"

    # 同一个文件的改动合为一个
    commits=$(git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"%H" -- "$file")
    git -C $REPO_ROOT diff --color=always "$(echo "$commits" | head -n 1)" "$(echo "$commits" | tail -n 1)" -- "$file"

    echo ''
    done \
    < <(git -C $REPO_ROOT log --author=$AUTHOR --since=$START_DATE --until=$END_DATE --oneline --pretty=format:"" --stat --name-only | sort | uniq | grep -v '^$')

    ```
    hxy100
        12
    hxy100  
       324 天前
    楼上大佬才是正解!
    yaocai321
        13
    yaocai321  
       324 天前
    " 还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。"
    6 的 🛫
    ltycn
        14
    ltycn  
       324 天前 via iPhone
    @yaocai321 知人不知而不愠 咱还是持续学习保持谦卑
    zhuisui
        15
    zhuisui  
       323 天前   ❤️ 1
    其实你的需求是不合理的,diff 基于 commit ,commit 在分支上是有序串连的。你想要指定作者生成 diff ,就会跳过某些 commit ,这样生成的 diff 会是什么样子,你如果善于做 cherry-pick 就会知道。另外,当你发现这个需求 git diff 命令无法满足的时候就该想到了

    其实我猜想你或许需要的是 git blame ,毕竟看你的描述,你也是想要 blame someone 😃

    `find src -type f -exec git blame --since xxx master..develop {} \; | grep author`
    不支持截止时间,还是用 rev range 吧
    laokiea
        16
    laokiea  
       323 天前
    @erquiasz0825 #8
    那基本上常规的命令是满足不了你的需求的,commit 是连续的,除非这个文件某段时间内都是同一个用户的修改,那其实直接 diff 最早一次 commit 就好了
    或者你可以试一下图形工具 把所有的 diff 都列出来 本质上跟 git log -p --author=xxx 没有区别
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3057 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:37 · PVG 08:37 · LAX 16:37 · JFK 19:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.