Bash 在命令行上获取git提交ID

Bash 在命令行上获取git提交ID,bash,git,autocomplete,Bash,Git,Autocomplete,当运行git commit--fixup=beefca7e或在提交消息中引用以前的提交时,我必须在一个笨拙的工作流中使用鼠标。我使用bash: 打开新的终端选项卡/窗口/窗格 git日志--oneline--graph 浏览列表以查找相关的提交sha 抓起鼠标,选择sha,将其复制到剪贴板。² 向后移动我正在工作的窗格并将其粘贴到那里 这很有效。但我怀疑这可以做得容易得多 是否有命令行工具、脚本或git插件允许我快速过滤提交并复制所选条目的sha? 我的工作流程是否错误(或幼稚),我是否错过了某

当运行git commit--fixup=beefca7e或在提交消息中引用以前的提交时,我必须在一个笨拙的工作流中使用鼠标。我使用bash:

  • 打开新的终端选项卡/窗口/窗格
  • git日志--oneline--graph
  • 浏览列表以查找相关的提交sha
  • 抓起鼠标,选择sha,将其复制到剪贴板。²
  • 向后移动我正在工作的窗格并将其粘贴到那里
  • 这很有效。但我怀疑这可以做得容易得多

    是否有命令行工具、脚本或git插件允许我快速过滤提交并复制所选条目的sha? 我的工作流程是否错误(或幼稚),我是否错过了某个重要的git功能

    在vim中也可以使用它,因为这是我编辑提交消息的编辑器。复制短sha而不是完整sha的奖励


    • 对于这个名为
      git lg
      ,我有一个更复杂的别名
    • ²xclip/gnome/clipboard管理器配置为选择时自动复制。否则ctrl-c/cmd-c左右。粘贴是鼠标中键。保存一些命令,但仍不太理想。我宁愿不使用鼠标,也不想省略大多数步骤

    gitk
    /
    gitg
    具有适用于linux的“快捷方式”:它们自动选择所选提交的sha1,并将其放置在X剪贴板中,您可以通过“中键单击”粘贴sha,而无需任何其他操作

    在windows上,如果自动选择sha1,您可以直接
    ctrl+C


    从命令行:您可以使用适当的命令将sha1复制到剪贴板,但根据您的需要,可能会涉及“适当的命令”:

    # easy :
    git rev-parse HEAD~4 | xclip -selection c
    
    # more involved :
    clipsha () {
        sha1=$(git log --format="%H" --grep "$1");
        git log --oneline -1 $sha1;
        echo $sha1 | xclip -selection c;
        echo " *** copied sha1 to clipboard"
    }
    # usage :
    clipsha "fixed issue #1234"  # will copy the sha1 of first which contains 
                                 # the message 'fixed issue #1234'
    
    如果您不想重新发明
    tig
    ,请检查我建议重复的问题:
    您可以在
    tig
    中添加快捷方式,将“所选提交的sha1”复制到剪贴板



    但说实话,我和你(或@torek)一样:我通过从终端上选择sha1来复制/粘贴它们。

    如果没有合适的工具,那么就创建它)得出以下结论:

    #!/bin/bash
    first_dialog() {
        dialog --output-fd 1        \
               --ok-label "Copy SHA" \
               --cancel-label "Exit"  \
               --menu "Select SHA to copy:" 0 0 0 "${list[@]}"
    }
    
    #-------------{ Create list for dialog }----------------
    while read -r sha desc; do
        list+=( "$sha" "$desc" )
    done < <(git log --oneline)
    
    first_dialog
    
    或者像这样:

    sha="$(~/ower/test)"
    $ echo $sha
    20799ef
    
    转换为函数:

    gsha() {
        list=()
        while read -r sha    desc; do
           list+=(  "$sha" "$desc" )
        done  < <(git log --oneline -n${1:-20})
        dialog --output-fd 1        \
               --ok-label "Copy SHA" \
               --cancel-label "Exit"  \
               --menu "Select SHA to copy:" 0 0 0 "${list[@]}"
    }
    
    sha="$(gsha)"
    $ echo $sha
    20799ef
    
    gsha(){
    列表=()
    读时-r sha desc;do
    列表+=(“$sha”“$desc”)
    完成<尝试,您不必键入sha,如果它是最新的提交,其消息提到了
    strcat
    ,您可以说
    :/strcat
    @^{/strcat}
    ,以了解在提交消息中从何处开始查找
    strcat


    要获得散列,请使用rev parse,如果您经常这样做,请制作一个
    rp
    别名或其他东西,然后
    :r!git rp:/strcat
    将sha放入编辑缓冲区。

    您可以使用提交相对语法,但请确保您知道您是否以及何时可能需要
    ^2
    而不仅仅是
    头~7
    。线性计数仅适用于如果你在提交图的一个线性部分上,你也可以使用提交消息搜索,比如
    :/foo
    。最后,虽然我倾向于使用哈希ID的剪切和粘贴。你试过
    tig
    ?@Ivan我试过tig,但在我必须探索历史时,我主要使用
    tig
    gitg
    然而,ig
    和gitg没有简单的方法来复制commit sha AFAIK,这意味着我必须使用tig或gitg,而不是常见的git命令来提交、写消息、写修复等。如果没有简单的方法来“获取git sha”Alltogether,我可能会重新考虑这个问题。这是否回答了你的问题?
    gsha() {
        list=()
        while read -r sha    desc; do
           list+=(  "$sha" "$desc" )
        done  < <(git log --oneline -n${1:-20})
        dialog --output-fd 1        \
               --ok-label "Copy SHA" \
               --cancel-label "Exit"  \
               --menu "Select SHA to copy:" 0 0 0 "${list[@]}"
    }
    
    sha="$(gsha)"
    $ echo $sha
    20799ef