【问题标题】:A better way to do git clone做 git clone 的更好方法
【发布时间】:2012-08-21 15:54:50
【问题描述】:

这是懒惰的程序员请求。我想创建一个 shell 脚本自动执行以下过程:

git clone <remote-repo-url>
cd <cloned-folder>
open <cloned-folder> 

所以这里的想法是克隆一个 URL,然后立即将 cd 复制到 cloned-folder 中。这里的技巧是从 url 模式中识别 cloned-folder

现在我们可以假设 url 结构是这种模式 .../&lt;cloned-folder&gt;.git 即 url。

我想知道我们是否真的可以使用awk 或类似的工具。我想我被困的部分是找到一个合适的regex

用例:这里的用例是如果你克隆一个 url,你希望尽快进入 repofolder。如果您想运行任何 git 命令,例如 git logmate .,这是先决条件,我们 99% 的时间都在这样做。

提前致谢。

【问题讨论】:

    标签: git shell automation


    【解决方案1】:

    执行此操作的 bash 函数(也适用于 zsh):

    function lazyclone {
        url=$1;
        reponame=$(echo $url | awk -F/ '{print $NF}' | sed -e 's/.git$//');
        git clone $url $reponame;
        cd $reponame;
    }
    

    awk 命令打印最后一个/ 之后的部分(例如从http://example.com/myrepo.gitmyrepo.git)。 sed 命令删除尾随 .git

    用法:

    $ pwd
    ~/
    $ lazyclone https://github.com/dbr/tvdb_api.git
    tvdb_api
    Cloning into 'tvdb_api'...
    remote: Counting objects: 1477, done.
    remote: Compressing objects: 100% (534/534), done.
    remote: Total 1477 (delta 952), reused 1462 (delta 940)
    Receiving objects: 100% (1477/1477), 268.48 KiB | 202 KiB/s, done.
    Resolving deltas: 100% (952/952), done.
    $ pwd
    ~/tvdb_api
    

    【讨论】:

    • 提供的答案不处理人性化名称位于斜杠之前的存储库。它也不处理git-bundle 存储库。我建议有兴趣支持这两个边缘案例的人使用(旧的)官方 Git shell 脚本:stackoverflow.com/a/13840631/1248449
    【解决方案2】:

    使用 git clone,您可以指定要克隆到的文件夹,而不是让其自动命名。

    dir=myclone
    git clone git://somerepo "$dir"
    cd "$dir"
    open "$dir"
    

    【讨论】:

    • 是的,我可以这样做...但我希望从 url 本身中提取我的文件夹名称。
    • 我想为 git clone 创建一个带有附加功能的快捷方式
    【解决方案3】:

    @dbr 回答的改进:

    function lazyclone {
        reponame=${1##*/}
        reponame=${reponame%.git}
        git clone "$1" "$reponame";
        cd "$reponame";
    }
    

    借助 Bash 的参数扩展,我们可以摆脱awksed

    【讨论】:

      【解决方案4】:

      bash 参数版本很好,我用basename 因为它看起来更干净

      function gclocd {
        # git clone and enter the cloned file
        if [[ -z "$2" ]]; then
          reponame=$(basename "$1" ".git");
        else
          reponame=$2;
        fi
          git clone "$1" "$reponame";
        cd "$reponame";
      }
      

      我为一堆这样的事情使用简短的、令人难忘的制表符可完成的函数名称,并将它们作为别名/函数放在我的 .bashrc 中,例如gcmmtgit commit -mlazy 很可能已经是你 shell 中事物的前缀,这意味着每次都要输入更多内容......

      【讨论】:

        【解决方案5】:

        我们可以将cd 放入最新创建的目录中,而不是从 url 获取目录名称。下面是对应的shell脚本:

        gclcd() {
            git clone --recursive $* && cd "$(ls -t | head -1)"
        }
        

        【讨论】:

          猜你喜欢
          • 2022-01-02
          • 1970-01-01
          • 2016-08-01
          • 2017-05-23
          • 1970-01-01
          • 2019-08-16
          • 2010-12-02
          • 1970-01-01
          • 2010-11-07
          相关资源
          最近更新 更多