git cloneの後に自動的にCDを作成するには?

git cloneの後に自動的にCDを作成するには?

特定のタスクを完了したら、コマンドcdで生成されたディレクトリに自動的に移動したいと思います。clonegit clone

重要:プロジェクトから自動的に取得されるzshの完了は中断されるため、コマンド構文(エイリアス/関数を使用するなど)を変更したくありませんPretzo

編集する:正解を選択しなかった理由は、上記の基準に合った回答が与えられなかったためです。

ZSHを使用しますが、他のシェルからの回答も許可されています。

答え1

関数を生成します。

gclonecd() {
  git clone "$1" && cd "$(basename "$1" .git)"
}

(「.git」の有無にかかわらずリンクに適用)

答え2

git clone使用するディレクトリと呼ばれる追加のパラメータが1つ必要です。これを現在の作業ディレクトリに複製すると、すでに存在git clone URL . する作業ディレクトリを変更する必要はありません。

コマンドが実際に作業ディレクトリを変更できるようにするには、必要に応じてgitrealを呼び出す関数に変更できます。git

git()
{
   local tmp=$(mktemp)
   local repo_name

   if [ "$1" = clone ] ; then
     /usr/bin/git "$@" | tee $tmp
     repo_name=$(awk -F\' '/Cloning into/ {print $2}' $tmp)
     rm $tmp
     printf "changing to directory %s\n" "$repo_name"
     cd "$repo_name"
   else
     /usr/bin/git "$@"
   fi
}

答え3

リポジトリのローカル名を指定すると、使いやすくなります。$_:

git clone [email protected]:npm/npm.git npm-local-dir && cd $_

しかし、長い名前を再入力したくない場合は、少し見苦しくなりますが、sedを使用すると可能です。

git clone [email protected]:pckujawa/pattern-rec.git && 
cd `echo $_ | sed -n -e 's/^.*\/\([^.]*\)\(.git\)*/\1/p'`

編集:まあ、Manav(以下の説明)の簡潔さに感謝します。

git clone foo/bar && cd !$:t

しかしそれはzshでは動作しません(何かについてzshを拡張する方法最初のコマンドは入力として扱われません)!$!$:t何が起きたのかを調べなければなりません(Bash シェルで進行中 ${me:-whatever} |)。!$前のコマンドの最後の部分をつかみ、:t「尾だけを残してすべての先行ファイル名コンポーネントを削除」します。良い情報ですが、zshと連携できたらいいです(試してみましたがnoglob成功しませんでした)。

sed編集:or !$:t(とにかくzshでは機能しません)を使用する代わりに、2つの異なるオプションを見つけました。https://unix.stackexchange.com/users/5685/frederik-deweerdt正解はhttps://unix.stackexchange.com/users/129926/henrik-n)のコメント:

git clone [email protected]:npm/npm.git && cd $(basename $_ .git)

または

git clone [email protected]:npm/npm.git && cd ${${_%%.git*}##*/}

答え4

次のことができます。

clone_check() {
  (($? != 0)) && return
  local cmd=$history[$((HISTCMD-1))]
  cmd=("${(@Q)${(z)cmd}}")
  if [[ $cmd = "git clone "* ]]; then
    local dir
    if (($#cmd == 3)); then
      dir=${cmd[3]:t}
      dir=${dir%.git}
      dir=${dir#*:}
    elif (($#cmd > 3)); then
      dir=$cmd[-1]
    else
      return
    fi
    print -r CDing into $dir > /dev/tty
    cd -- $dir
  fi
}
precmd_functions+=(clone_check)

とても簡単です。precmd最後のコマンドラインがgit clone .../somethingorに似ていることを確認しgit clone .../something dir、そこからディレクトリを推測してそこに入るフック(すべてのプロンプトの前に実行されます)です。

git clone foo; whateverwhatever; git clone fooor or ...と入力すると機能しませんgit clone --option repo

関連情報