我需要一个 git 命令,做到如下事情:
例如:
git log --author=jack --since=2023-12-16 --until=2023-12-31 -p
这条命令,会显示 jack 每次提交的改动,如果 xxx.go 文件有多次修改,会显示每次的改动记录,而不是只显示最终的改动对比,这样也是不行的。
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 回答,仅供参考 |
2
erquiasz0825 OP @ltycn 谢谢,在提问之前我也问过 chatgpt ,你只是替我问了 chatgpt ,都没有看看符不符合需求
|
3
erquiasz0825 OP 还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。
|
4
SculptureSand 324 天前 via Android
@ltycn
下次别贴 AI 内容了,违反站规的 |
5
xiangyuecn 324 天前
用图形界面都不需要思考
|
7
laokiea 324 天前
对于同一个文件的多次改动,把最终的改动汇总到一起展示
需要过滤其他用户对同一个文件同一个部分的修改? |
8
erquiasz0825 OP @laokiea 只要指定作者的修改
|
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 不能满足你的要求,说明你的提问方式有问题 |
10
rrfeng 324 天前
最终变动肯定是 diff
先用 log --author 找出来,然后 diff start..end xxx.go 完事 但是 diff 不可能分 author 的。 |
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 '^$') ``` |
12
hxy100 324 天前
楼上大佬才是正解!
|
13
yaocai321 324 天前
" 还以为马上就有高人给出了答案,原来是问的 chatgpt 甚至懒得看回答对不对。"
6 的 🛫 |
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 吧 |
16
laokiea 323 天前
@erquiasz0825 #8
那基本上常规的命令是满足不了你的需求的,commit 是连续的,除非这个文件某段时间内都是同一个用户的修改,那其实直接 diff 最早一次 commit 就好了 或者你可以试一下图形工具 把所有的 diff 都列出来 本质上跟 git log -p --author=xxx 没有区别 |