補完 - git rootにcdするシェルコマンドのgitエイリアスが期待通りに動作しない



ブランチ 機能 (1)

私はgit rev-parse --show-toplevelを使用してgitルートディレクトリにcdするためのエイリアスを定義しようとしています。

現在私は私の.bashrcエイリアスとしてそれを持っています。

alias gitroot='cd "$(git rev-parse --show-toplevel)"'

しかし、私はあなたがgitエイリアスを使ってシェルコマンドを実行できることを知っているので、私は私のファイルを少しきれいにするために私のコマンドを私の.gitconfigに移動することを考えました。

問題は、エイリアスが機能しない理由がわからないことです。 現在私の.gitconfig [alias]下にこれがあり.gitconfig

root = "!sh -c 'cd \"$(git rev-parse --show-toplevel)\"'"

しかし、私がgit rootを実行するとき、私はただ現在のディレクトリに置かれたままです。

私は他のシェルエイリアスを試してみました、そしてそれらはうまくいきました、例えばエイリアスsay = "!sh -c 'echo \"$0\"'"うまく働きます:

$ git say hello
hello

私は似たようなcdコマンド( cd = "!sh -c 'cd \"$0\"'" )が失敗することに気づきましたが:

~/repos/myproject$ git cd /home/
~/repos/myproject$

それが私の文法と関係があるのか​​、それともcdコマンドをサポートしていないのがgitエイリアスのような奇妙な話なのか、それともまったく別のことなのか私は理解できません。

それが助けになるなら、私はGit 1.7.9.5を使っています。


あなたのシェルはGitを呼び出しており、Gitはあなたのcdコマンドを実行するための別のシェルを呼び出しています。 このコマンドは成功し、これは子シェルの作業ディレクトリを変更しますが、Gitの作業ディレクトリも親シェルの作業ディレクトリも変更しません。

これを行うには、 現在のシェルでコマンドを実行する必要があります。これは、Gitを起動してもこれを達成できないことを意味します。 シェルエイリアスを使い続ける必要があります。

例として、 up.shという次のシェルスクリプトがあるとしup.sh

#!/bin/sh
cd ..

このスクリプトを./up.shとして実行した場合、 cdは新しいシェルインスタンスで実行されたため、現在のシェルの観点からは何も変わりません。 しかし、あなたがそれを実行するならば. up.sh . up.sh 、これはあなたの現在のシェルにサブシェルを生成せずにファイルの内容を単独で実行するように指示します。 その場合、現在のシェルの作業ディレクトリが変わります。

それがここでの大きな違いです。 Gitエイリアスの使用は./up.shメソッドに似てい. up.shが、シェルエイリアスは./up.shメソッドに似てい. up.sh . up.shメソッド





alias