求助一个 git 命令 - V2EX
git
Pro Git
Atlassian Git Tutorial
Pro Git 简体中文翻译
GitX
erquiasz0825
V2EX    git

求助一个 git 命令

  •  
  •   erquiasz0825 Jan 2, 2024 2897 views
    This topic created in 861 days ago, the information mentioned may be changed or developed.

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

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

    例如:

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

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

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


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

    需要过滤其他用户对同一个文件同一个部分的修改?
    erquiasz0825
        8
    erquiasz0825  
    OP
       Jan 2, 2024
    @laokiea 只要指定作者的修改
    ltycn
        9
    ltycn  
       Jan 2, 2024
    抱一丝各位,我寻思这么简单的问题 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  
       Jan 2, 2024
    最终变动肯定是 diff
    先用 log --author 找出来,然后 diff start..end xxx.go 完事

    但是 diff 不可能分 author 的。
    yechentide
        11
    yechentide  
       Jan 2, 2024
    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  
       Jan 2, 2024
    楼上大佬才是正解!
    ClaudeCode
        13
    ClaudeCode  
       Jan 2, 2024
    " 还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。"
    6 的
    ltycn
        14
    ltycn  
       Jan 2, 2024 via iPhone
    @yaocai321 知人不知而不愠 咱还是持续学习保持谦卑
    zhuisui
        15
    zhuisui  
       Jan 3, 2024   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  
       Jan 3, 2024
    @erquiasz0825 #8
    那基本上常规的命令是满足不了你的需求的,commit 是连续的,除非这个文件某段时间内都是同一个用户的修改,那其实直接 diff 最早一次 commit 就好了
    或者你可以试一下图形工具 把所有的 diff 都列出来 本质上跟 git log -p --author=xxx 没有区别
    About     Help     Advertise     Blog     API     FAQ     Solana     5709 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 78ms UTC 06:49 PVG 14:49 LAX 23:49 JFK 02:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86