web-dev-qa-db-ja.com

git clone後に自動的にcdする方法は?

何かをgit clonedした後、cdコマンドによって作成されたディレクトリに自動的にcloneしたいと思います。

重要:Pretzoプロジェクトから自動的に取得するzsh-completionsが壊れるので、コマンドの構文を変更したくない(たとえば、エイリアス/関数を使用)。

[〜#〜] edit [〜#〜]:正しい答えを選択しなかったのは、上記の条件に適合する回答がなかったためです。

私はZSHを使用していますが、他のシェルでの回答も受け入れられます。

40
wildeyes

関数を作成します。

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

(「.git」の有無に関係なくリンクで機能します)

25

git cloneは、追加の引数、つまり使用するディレクトリを取ります。 git clone URL .を使用して、現在の作業ディレクトリにクローンを作成できます。その後、作業ディレクトリを変更する必要はありません。あなたはすでにそこにいます。

gitコマンドで実際に作業ディレクトリを変更したい場合は、必要に応じて実際の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
}
18
Kaz

リポジトリのローカル名を指定する場合、 $ _ を使用するのは非常に簡単です。

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 Shellでの前進| $ {me:-whatever} )。 !$は前のコマンドの最後の部分を取得し、:tは「先頭のファイル名コンポーネントをすべて削除し、末尾を残します」。良い情報ですが、zshで動作するようにしたいのですが(noglobを試したところ成功しませんでした)。

編集:sedまたは!$:t(zshでは機能しない)を使用する代わりに、他の2つのオプションを見つけました(1つは 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*}##*/}
7
Pat

これは、OSXに対する上記の回答の適応です。

  • mktempには追加のパラメーターが必要です
  • git cloneはデフォルトでSTDERRに書き込みます( this を参照)

関数:

function git {
   local tmp=$(mktemp -t git)
   local repo_name

   if [ "$1" = clone ] ; then
     command git "$@" --progress 2>&1 | 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
     command git "$@"
   fi
}
2
davidhq

POSIXシェルの簡単な解決策は、クローンを作成するディレクトリを明示的に指定し(任意のファイルシステムパス)、それを再利用することです。

git clone <repository> <directory> &&
cd "$_"

そして

cd -

終わったら.

2
Sander

あなたは次のようなことをすることができます:

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 .../somethingまたはgit clone .../something dirのようになっているかどうかをチェックし、そこからディレクトリを推測してそこにcdします。

git clone foo; whateverまたはwhatever; git clone fooまたはgit clone --option repo...を入力した場合は機能しません。

2

これをシェルに含めます:

git(){
  case "$1" in clone) git-clone "${@:2}";; *) command git "$@";; esac
}
git-clone(){ 
   local tgt 
   tgt=$(command git clone "$@" 2> >(tee /dev/stderr |head -n1 | cut -d \' -f2)) ||
      return $?
   cd "$tgt"
}

これは、gitの標準エラーからクローンターゲットをこっそり収集し、クローンが成功した場合にのみターゲットにcd 'することで機能します。

通常のgit cloneが行うすべての引数とオプションを受け入れます。

Gitラッパーを使用して、完了を心配する必要がないか、またはgitラッパーを削除して、git cloneの完了をgit-cloneに再配線できます。

0
PSkocik

私はそれをお勧めしませんが、あなたはcouldこのワンライナーを使用します:

echo 'project' | xargs -I % sh -c 'git clone https://github.com/username/%.git && cd %'

0
christianbundy