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


37

何かをした後cdcloneコマンドによって作成されたディレクトリに自動的にしたいgit clone

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

編集:私が正しいと答えを選ばなかった理由は、上記の条件を満たした答えが与えられなかったからです。

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


私は答えunix.stackexchange.com/questions/97920/…が好きですが、その関数を~/.bashrcファイルに書き込むことを言及する必要があり(たとえば)、少なくとも私にとっては機能しませんでしたが、行:/usr/bin/git "$@" 2>&1 | tee $tmp
lcestari

回答:


19

関数を作成します。

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

(「.git」のあるリンクとないリンクの両方で機能します)


2
git clone使用していない場合は変更する必要があるすべてのツールがあるため、使用し続けたいと思いgitます。ハブは gitのようエイリアスされ、OH-MY-zshの自動補完などを提供しています...
ダニエルK.

3
@Wildeyes gitはシェルの作業ディレクトリを変更できないため、どちらの方法でも、必要な処理を行い、組み込みコマンドでフォローアップするエイリアス/関数でラップする必要がありますcd。のhub代わりに呼び出す場合gitは、関数で呼び出します。cloneコマンドにのみ影響を与えたい場合は、関数内のアクションを確認してください。など
frostschutz

basename git@github.com:pckujawa/pattern-rec.gitpattern-rec.gitが生成されることに気づきました-クローンを作成するときに.git拡張子をそのまま残していますか?
パット14年

8
@Patはbasenameあなたが行うことができますので、また、接尾辞引数を取る:git clone $1 && cd $(basename $1 .git)
ヘンリックN

17

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
}

それはまさに私が探していたものでした。内部フックなどがないことに気付いた後、ほぼ正確な関数を作成しました:)
ダニエルK.

2
@Wildeyesはい:/tmp現代のLinuxがtmpfs経由で行うように、RAM内にボリュームがあります。とにかく、なぜあなたは...あなただけのディレクトリを作成し、ディスクにおそらく数百のファイルを書き込みgitのクローンを、やった時に、ディスクへの書き込みを気にします
カズ

1
「nvmがディスクに書き込む場合」については、おそらく正しいと思います。余分な操作を節約したいだけです。どうもありがとう、カズ。
ダニエルK.

3
注意してください。ですgit [flags] command [arguments]のでclone、特定の位置で盲目的に要求しても失敗します。
フォンブランド

1
「実際の」パスを追加すると役立ちますか?Like:git_real_home = which git git(){... $ git_real_home "$ @" | ティー$ tmp
aakoch

7

リポジトリのローカル名を指定すると、$ _を使用して本当に簡単です:

git clone git@github.com:npm/npm.git npm-local-dir && cd $_

ただし、長い名前を再入力したくない場合は、少しいですが、sedで実行できます。

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

編集:まあ、私はマナヴ(以下のコメント)に簡潔に感謝するつもりだった

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

ただし、zshでは機能しませんzshがどのように展開するかによって、最初のコマンドがへの入力として扱われなくなります!$)。何を!$:tしたのか調べなければなりませんでした(Bashシェルでの前進| $ {me:-whatever})。!$前のコマンドの最後の部分を取得し、:t「先頭を残してすべてのファイル名コンポーネントを削除します」。良い情報ですが、zshで動作するようにしたいと思います(私はnoglob成功しませんでした)。

編集:sedまたは!$:t(私にとってはzshでは動作しません)を使用する代わりに、2つの他のオプション(https://unix.stackexchange.com/users/5685/frederik-deweerdtの答えをhttpsで適応させるもの)を見つけました://unix.stackexchange.com/users/129926/henrik-nのコメント):

git clone git@github.com:npm/npm.git && cd $(basename $_ .git)

または

git clone git@github.com:npm/npm.git && cd ${${_%%.git*}##*/}

git clone foo/bar && cd !$:t
マナヴ

リポジトリのURLが末尾にある.git場合は、を使用!$:t:rしてフォルダー名を取得できます。
マイケルストラメル

2

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

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

そして

cd -

終わったら。


2

次のようなことができます:

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...


+1コードをありがとう。数日から使用しています。1つの問題に気づきました。あなたには、いくつかのプロジェクトのクローンを作成した後、端末権利を閉じた場合、あなたは、ターミナルを開き、次の時間は、zshのは、2つのエラーメッセージで文句:CDing into <project>clone_check:cd:17: no such file or directory: <project>。エラーは、端末を閉じる前に最後に実行したコマンドがと異なるとすぐに消えます$ git clone
user938271

2

以下は、上記の回答の適応です OSX

  • mktemp 追加のパラメーターが必要
  • git cloneSTDERRデフォルトで書き込みます(これを参照)

関数:

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
}

1
あなたの「上」を示す7つの答えがあります。しかし、時間の経過とともに変化する可能性があります。このような参照はSEでは意味がありません。回答を編集し、参照している回答へのリンクを含めてください。
テクラフ

0

お勧めしません、このワンライナーを使用できます。

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


0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.