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

git 如何所有分支里边搜索代码片段

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

    本来有个表基本不需要更新,突然今天要更新一下,写代码的人离职了,整理数据的代码又不知道提交到那个分支上去了也没合并,好一个大坑,那么怎么找到这部分代码呢

    搜索了下尝试了下边这个方式不得行

    git grep "are you ok" | $(git rev-list --all)
    
    35 条回复    2022-01-21 11:40:48 +08:00
    gadfly3173
        1
    gadfly3173  
       124 天前
    知道提交时间的话不如直接去看提交记录
    huazhaozhe
        2
    huazhaozhe  
    OP
       124 天前 via Android
    @gadfly3173 都不知道在哪个分支怎么看体检记录🤢
    huazhaozhe
        3
    huazhaozhe  
    OP
       124 天前 via Android
    更新
    linux 下这个命令跑了好久终于有结果了,代码也没那么多啊,可能是分支太多了吧🙃
    这个命令在 windows 下要怎么使用呢
    gadfly3173
        4
    gadfly3173  
       124 天前
    @huazhaozhe #2 用 gui 可以看,比如 sourceTree gitkraken 之类的
    huazhaozhe
        5
    huazhaozhe  
    OP
       124 天前 via Android
    @gadfly3173 emm 虽然知道这些个工具但是没用过,一般都是命令行
    wolfie
        6
    wolfie  
       124 天前
    A B C D ... 每个分支一个独立文件夹。
    用 IDE 打开父文件夹。
    gadfly3173
        7
    gadfly3173  
       124 天前
    @huazhaozhe #5 以及 powershell 不支持这个命令的写法的话可以直接用 git bash
    huazhaozhe
        8
    huazhaozhe  
    OP
       124 天前 via Android
    @wolfie 好几百个分支,写个程序每个分支复制一个文件夹也不是不可以,然后文本搜索呢,虽然我有工具全盘搜索文本内容,嗯,感觉一个小时能弄完😏
    huazhaozhe
        9
    huazhaozhe  
    OP
       124 天前 via Android
    @gadfly3173 git bash 告诉我参数太长,我很想知道 windows 里边怎么写 linux 里边的$(ls -a)这样子的命令,cmder 测试不支持
    daxiguaya
        10
    daxiguaya  
       124 天前
    gadfly3173
        11
    gadfly3173  
       124 天前
    @huazhaozhe #9 gitbash 有那么容易参数过长么。。。你的输入是啥啊
    rbe
        12
    rbe  
       124 天前
    @huazhaozhe #9 参数太长就用 xargs
    git rev-list --all | git grep "are you ok"
    huazhaozhe
        13
    huazhaozhe  
    OP
       124 天前 via Android
    @gadfly3173 就正文里边的那个
    huazhaozhe
        14
    huazhaozhe  
    OP
       124 天前 via Android
    @rbe 这个搜不到结果命令就结束了
    huazhaozhe
        15
    huazhaozhe  
    OP
       124 天前 via Android
    @daxiguaya 内网环境没有这个东西😤
    gadfly3173
        16
    gadfly3173  
       124 天前
    @huazhaozhe #15 下面有本地部署的
    rbe
        17
    rbe  
       124 天前
    @huazhaozhe #14 搜不到结果?那说明你搜错了吧,尝试缩小一些关键词范围呗.
    还有个办法是 git bisect 二分查找,每次 checkout 之后去检查代码里有没有你要的那些信息
    huazhaozhe
        18
    huazhaozhe  
    OP
       124 天前 via Android
    @rbe windows 下尝试确实是的,linux 还没试过,不过内容肯定存在的,因为 linux 下已经通过正文里边的方式搜到结果了
    gadfly3173
        19
    gadfly3173  
       124 天前
    说来你知道是谁提交的话 还有个方法是 git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
    --before="2008-11-01" --no-merges -- t/ 参考 https://git-scm.com/book/zh/v2/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86%E5%8F%B2
    huazhaozhe
        20
    huazhaozhe  
    OP
       124 天前 via Android
    貌似通过 git rev-list --all --grep=addE 可以一个命令完成,明天去试试,下班下班
    SoloCompany
        21
    SoloCompany  
       124 天前
    不嫌慢可以用 for-each-ref 啊
    SoloCompany
        22
    SoloCompany  
       124 天前
    --grep 是查找 commit message 不是文件内容
    BBCCBB
        23
    BBCCBB  
       124 天前
    试试 git log -S 或者 reflog 呢
    jptx
        24
    jptx  
       123 天前
    也可以使用 gitbase 这个工具,用写 SQL 的方式来从 git 中搜索感兴趣的内容。
    官方仓库: https://github.com/src-d/gitbase
    你这个需求可以参考这条 SQL 来处理,这条 SQL 是从所有地方搜索 TODO 的,可以改成你要搜索的代码片段: https://github.com/src-d/gitbase/blob/master/docs/using-gitbase/examples.md#get-miscelaneous-information-about-lines-with-a--todo-comment-in-head
    wzzzx
        25
    wzzzx  
       123 天前
    我觉得可以先筛出提交者,然后再进行查找的工作
    a132811
        27
    a132811  
       123 天前   ❤️ 2
    总结一下:
    ```
    搜索所有的 commit 的 code diff(最快)

    git log -p --all -S 'search string'
    git log -p --all -G 'match regular expression'

    搜索所有 local branch

    git branch | tr -d \* | sed '/->/d' | xargs git grep <regexp>

    搜索所有的 commit

    git grep -F "keyword" $(git rev-list --all)
    git grep <regexp> $(git rev-list --all)
    git rev-list --all | (while read rev; do git grep -e <regexp> $rev; done)


    ```
    ynyounuo
        28
    ynyounuo  
       123 天前
    你这个需求用 github 网友的 pickaxe-diff 是最简洁舒适的
    结合了 pickaxe-all 但是又不会 print 所有 log -p 无关的 diff

    具体参考这里:
    #limiting-diff-output
    huazhaozhe
        29
    huazhaozhe  
    OP
       123 天前 via Android
    @a132811 这个可以,能找到 commit 就有救了👍🏻
    huazhaozhe
        30
    huazhaozhe  
    OP
       123 天前 via Android
    @a132811 正文里边那个 linux 其实可以,就是有点慢
    huazhaozhe
        31
    huazhaozhe  
    OP
       123 天前 via Android
    @a132811 奇怪的是,windows 下这个命令没有结果
    huazhaozhe
        32
    huazhaozhe  
    OP
       123 天前 via Android
    @a132811 windows 下 git log -p --all -S 'search string'这个命令没有结果,linux 可以
    huazhaozhe
        33
    huazhaozhe  
    OP
       123 天前 via Android
    @wzzzx 每个人 commit 堆积的有点多,最好还是能直接找到🈶相关代码片段的 commit 好一些
    huazhaozhe
        34
    huazhaozhe  
    OP
       123 天前 via Android
    @SoloCompany 确实
    huazhaozhe
        35
    huazhaozhe  
    OP
       123 天前 via Android
    @ynyounuo 这个厉害,里边前半部分和楼上的一样,已经满足需求了
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2967 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:40 · PVG 22:40 · LAX 07:40 · JFK 10:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.