すべてのGitコマンドの最初に「git」を入力しないようにするにはどうすればよいですか?


190

gitすべてのGitコマンドの先頭に単語を入力しなくても済むようにする方法があるかどうか疑問に思っています。

gitコマンドプロンプトを開いて「Gitモード」に入った後、最初に一度だけコマンドを使用する方法があったらいいですね。

例えば:

git>

その後、入力するすべてのコマンドはデフォルトでGitコマンドとして解釈されます。

MySQLシェルを使用してデータベースコマンドを作成する方法と同様の方法で:

mysql>

これgitにより、1日に何百回も入力する必要がなくなります。

注:git-bash Windowsではを使用しています。


87
スタックオーバーフローのための「一般的なコンピューティング・ハードウェアとソフトウェアについての質問があり、オフトピック:オフトピックであること、それに基づいて近くに投票した人に、あなたがクリックされたテキストを読んでください、彼らは直接のツールは、主にプログラミングに使用伴わない限り、 ……」Gitはプログラマーが使用するツールです。このサイトに独自のタグがあることからも明らかです。
JBentley、

5
なぜ「git」をそんなに多く入力するのですか?IDEには、キーを押すだけで利用できる強力なvcs統合が必要です。"git pull"を1日に50回入力するのか、それともctrl-tを入力するのか、それとも不要な場合はコマンドラインの戦士でなくなる;)
vikingsteve

8
@vikingsteve実質的にすべての gitのヘルプと知識は、コマンドラインの観点から与えられます。
Ed Randall

6
@vikingsteve高速なので、私はそれをたくさん入力しています。私は〜100wpmと入力します。Gitのようにキー入力に精通している場合はさらに入力します。GUIをクリックするよりも簡単です。お気に入りのIDEにはキーボードショートカットがある場合があります。いいですね <M-Tab> git blah <CR>がすでに筋肉の記憶にある場合、なぜそれらを学習するのに時間無駄にするのですか?
モニカの訴訟に資金を提供する

3
「ユーザーが意味のない質問をしているので、この質問はクローズする必要があります」-あなたが尋ねていることを私が得るように、シェルが「で始まらないでこれを行う方法が実際にあった場合は、「gitコマンド」。
user3728501

回答:


190

gitshを試してみてください。彼らのreadmeから:

gitshプログラムはgitのための対話型シェルです。内からgitshあなたもあなたの地元のエイリアスとコンフィギュレーションを使用して、任意のgitのコマンドを発行することができます。

  • Gitコマンドはグループにまとめられる傾向があります。git専用のgitシェルで実行することにより、何度も入力することを避けます。
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

または、リンクされている他のプロジェクトをご覧ください。

  • git-sh -Gitプロンプト、エイリアス、補完機能を備えたカスタマイズされたbashシェル。
  • gitsh -Perlで書かれたシンプルなGitシェル。
  • repl -REPL内のサブコマンドでプログラムをラップします。

注:これは自分では使用していません。


22
不平 ... ... repl(1)はREPLではありません。評価も印刷もしません。プログラムを実行します。
Kevin

11
@Kevinユーザー要求を読み取り、(プログラムを実行して)ユーザー要求を評価し、プログラムの出力を出力します。これはシェルが行うことでもあります。
Yakk-Adam Nevraumont

2
@ Yakk-AdamNevraumont:いいえ、間違いなく「プログラムの出力を出力」しません。これは、端末にプログラムの標準出力をフックし、その後、プログラムは、独自の出力を出力します-プログラムの標準出力は既に(上自動的に継承され、端末にフックアップされた以外fork()/ exec())、そうrepl(1)であってもやっていないことを
Kevin

6
@Kevin私はあなたの感情を理解していますが、REPLを厳密に定義すると、さまざまな言語のほとんどのインタープリター「REPL」が除外されます。純粋な関数型言語でのみ、評価に副作用がないことを確認できますが、Haskellの場合でも、「REPL」GHCiはデフォルトでIOアクションも受け入れ、ターミナルに接続された画面への印刷などの副作用を含めてアクションを実行します。
leftaroundabout

2
@Kevin replはスタンドアロンREPLではありません。これreplは、インタラクティブなコンポーネントのみのREPLシステムを作成する手段です。それは公正ですか?
カイルストランド

116

これを行うPerlワンライナー:

perl -nE 'BEGIN {print "git > "} system "git $_"; print "git > "'

これにより、プレフィックスがgit。で始まる入力内容が実行されます。そして、ヒットするまでそれを続けます^D


6
これは、OPが求めているものと最もよく似ており、非常に軽量なパッケージになっています。
ruohola

2
これは、readlineで動作する場合は完璧ですが、残念ながら動作しません(これは、Perlの-neフラグを厳密にハックしているため、当然のことです)。
Konrad Rudolph

11
@KonradRudolphperl -MTerm::ReadLine -E '$n = Term::ReadLine -> new ("git"); while ($_ = $n -> readline ("git > ")) {system "git $_"}'

57

これは正確にはあなたが求めているものではありませんが、~/.bashrc最も頻繁に使用するGitコマンド用にいくつかのシェルエイリアスを設定できます。

alias commit='git commit'
alias checkout='git checkout'
...

また、Git自体の中でエイリアスを作成できることにも注意してください。

git config --global alias.ci commit
git config --global alias.co checkout
...

これにより、などのgit ci代わりに入力できますgit commit


7
このアプローチの欠点は、Gitコマンドごとに個別のエイリアスを作成する必要があることです。
Tim Biegeleisen

22
最も頻繁に使用される場合のみ。git hash-objectつまり、どれくらいの頻度で使用しますかgit interpret-trailers?私が知っている限りでは、質問が求めているものが実際には存在しないので、私はこれを代替として提供しています。
トーマス

15
加えて、ciためにcommit私はまた、シェルのエイリアスを使用gするためにgit、これは、タイピングのほとんどを低減し、私は私の好みのシェルに滞在することができます。
rkta

32

私はGitBashの〜/ .bash_profileでエイリアスを使用するのが大好きです。あなたがこのアプローチで行くなら、ここに私のお気に入りのいくつかがあります:

# git
alias gw='git whatchanged'
alias gg='git grep -n -C8'
alias ggi='git grep -i -n -C8'
alias gb='git branch'
alias gbd='git branch -D'
alias gba='git branch -a'
alias gc='git checkout'
alias gcp='git cherry-pick'
alias gfo='git fetch origin'
alias s='git status'
alias gmom='git merge origin/master'
alias grom='git rebase origin/master'
alias gpom='git pull origin master'
alias pplog='git log --oneline --graph --decorate'

3
コミットはどこ
ですか

14
含めない、commitまたはpush何かを破壊していないことを確認するために(入力中に)数秒余分に欲しい
JacobIRR

3
強制プッシュを使用しない限り、コミットとプッシュは何も破壊できません。しかし、私は事前にgit statusを使用しようとします。
qwr

1
これも私がやったことです、+ 1。他の回答が述べているように、私はgitshを試してみたくなりますが
CoffeeTableEspresso

1
@CoffeeTableEspressoいくつかのキーストロークが更新の保存とプロジェクトの破棄の違いであることを認めたことを尊重します。
LogicalBranch

31

エディターを使用します。

vsコードのcommitようなお気に入りのエディターからのようにコマンドを入力し、gitでより効率的にします。

ここに画像の説明を入力してください

または、次のように入力gitしてすべてのコマンドを取得します。

ここに画像の説明を入力してください


13
私はこれらすべての反対票に驚いています。これは、これらの機能をサポートするIDEを使用する人にとってはひどい答えではありません。
Glen Pierce

4
誰もがVS-Codeを使用/好むわけではないため、人々は反対票を投じたと思います。いずれにせよ、それはまともな解決策だと思うので、私から+1してください。
LogicalBranch

4
@LogicalBranch、一般的に人々はコマンドラインからgitを使用していますが、私はそれを知っていますが、一部のエディター内のgitサポートが存在し、試してみる価値があります。
prosti

1
誰もがVSコードを使用するわけではないので(私は個人的には好きではありません)、この回答は好きではありませんが、これはそれを使用するpplの優れたソリューションであるため、反対票を投じません。
CoffeeTableEspresso

1
あなたは崇高を使用している場合@CoffeeTableEspresso、そこと呼ばれるプラグインですgitsavvyは、のように...ほぼすべてのエディタ、今日のgitのサポートのいくつかの種類があります。「エディタを使用する」を読むことができるので、これが答えのポイントでした。
prosti

26

私の友人がこれを実現する小さなbashスクリプトを作成しました。これはReplifyと呼ばれます

$ replify git
Initialized REPL for [git]
git> init
Initialized empty Git repository in /your/directory/here/.git/

git> remote add origin https://your-url/repo.git

git> checkout -b new-branch
Switched to a new branch 'new-branch'

git> push

6
わかりました。既にUmurの回答で述べましたevalが、元のスクリプトソースでを使用することは最良のアイデアではありません。while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";done代わりに使用するように友達に
知ら

23

ここに別の方法があります。それも求められたものではありませんが、私はしばらくそれを使用しており、それはかなりいいです。次の行をに追加します~/.bashrc

complete -E -W git

空のBashプロンプトでTabを押すと、「git」と入力されます。


5
別のシェルを使用している場合は、適切なファイルに配置する必要があることに注意してください。例えば、zshのために、あなたはそれをあげるよ~/zshrctcshのために、あなたがそれを置くだろう、~/tcshrcなど、
TheOnlyMrCat

20

私は、これは非常に遅く答えである知っているが、私はしてきたので、この質問は本当に私と一緒にノートを打たを扱う今はかなりしばらくの間、繰り返しのこの種の苦しみ。

私はあなたのことはわかりませんが、正直に言っ(私は繰り返しません)すべてのgitコマンドのエイリアスを作成したくないので、代わりにこの問題を解決するためにNoGitと呼ばれるpythonスクリプトを書きました:

#!/usr/bin/env python
import sys, os, signal, atexit, readline, subprocess

commands, stop, history_file = [], False, os.path.join(os.getcwd(), "git.history")

def run_commands():
  stop = True
  for cmd in commands:
    command = ["git" if not cmd.startswith("git ") else ""]
    command = [cmd] if command[0] == "" else [command[0], cmd]
    subprocess.Popen(command).communicate()
    commands = []

def signal_handler(sig, frame):
  run_commands()
  sys.exit(0)

try:
  readline.read_history_file(history_file)
  signal.signal(signal.SIGINT, signal_handler)

  while True:
    if stop == True:
      break
    command = input("git> ")
    if command == "%undo":
      commands.pop()
    elif command == "%run":
      run_commands()
    elif command == "%exit":
      sys.exit(0)
    else:
      commands += [cmd.strip() for cmd in command.split(";")]

  signal.pause()
  readline.set_history_length(-1)
except IOError:
  pass

atexit.register(readline.write_history_file, history_file)

NoGitは、「git」キーワードの不要な繰り返しを防ぐための単純なPythonスクリプトです。

ドキュメンテーション:

  • %undoコマンドはスタックから最後のコマンドを削除します
  • %runこのコマンドは、スタック内のコマンドを実行し、スタックをクリア
  • %exitコマンドは何もせずにCLIを閉じ
  • 押すことctr+cは実行することと同じです%run; %exit
  • スクリプトは、呼び出されたファイルに実行されたコマンドを保存します git.historyと同じフォルダーにあるれ
  • セミコロンを使用して1行に複数のコマンドを追加できます
  • gitコマンドの最初にキーワードを使用でき、スクリプトはそれを複製しません(例:に git initならないgit git init

コマンドの例:

  1. init
  2. add .
  3. stage .
  4. commit -m "inital commit"
  5. %run; %exit

追加情報(Linuxユーザーの場合):

必要に応じて、.py拡張機能を削除し、次を使用して実行可能ファイルに変換できます。

mv ./git.py ./git
chmod +x ./git

次に、次のようにスクリプトを呼び出す代わりに:

python3 git.py

代わりにこれを実行します。

./git

追加情報(怠惰な人向け):

怠惰でタイプアウトしたくない./場合は、このスクリプトを/bin/フォルダーに移動して、エイリアスを作成できます。

あなたが本当に、本当に怠惰な場合は、次のコマンドを使用してください:

sudo cp ./git /bin/nogit
sudo chmod +x /bin/nogit
alias nogit='/bin/nogit'

あなたが本当に、本当に、本当に怠惰な場合は、次のワンライナーをコピーして貼り付けてください:

sudo cp ./git /bin/nogit && sudo chmod +x /bin/nogit && alias nogit='/bin/nogit'

あなたの怠惰が以前に人類に知られていなかったレベルに達した場合、同じワンライナーのよりコンパクトなバージョンは次のとおりです:

sudo cp ./git /bin/nogit;sudo chmod +x /bin/nogit;alias nogit='/bin/nogit'

幸運を。


17

任意のコマンドで機能する別のアプローチ:Ctrl + R(reverse-i-search)を使用します。

reverse-i-searchを使用すると、コマンド履歴を検索できます。検索文字列を押した後、Ctrl + Rを繰り返して、同じ文字列でさらに検索を繰り返します。

コマンドを1回入力するだけで、コマンドのサブストリングからそのコマンドを呼び出すことができます。ほとんどの場合、非常に長いコマンド全体とそのさまざまなバリエーションを、適切に配置された2〜3文字の検索文字で呼び出すことができます。シェルを通常使用する以外に事前設定は必要ありません。シェルをどのように使用したかに応じて自己適応します。完全なコマンドを1回入力するだけで、コマンドがコマンド履歴に自動的に追加されます。

  • git commit --amend<Ctrl+R>am
  • git pull<Ctrl+R>pu
  • git rebase --rebase-merges -i --onto origin/develop origin/develop feature/blue-header<Ctrl+R>blu
  • git rebase --abort<Ctrl-R>ab
  • git rebase --continue<Ctrl-R>con
  • docker-compose stop && git pull && make && docker-compose up -d<Ctrl-R>up

さらに、Ctrl-Rはbashだけでなく、Pythonシェル、IPython、mysqlシェル、psqlシェル、irb(ルビー)など、readlineライブラリを使用する多くのプログラム(多くあります)で機能します。


15

あなたの例では、それをMySqlプロンプトと比較します。動作する方法は、MySqlプロセスが開始し、そのプロセスにコマンドを与えることです。そのため、選択した言語で同様の何かを書いてみませんか?C ++での簡単な例を次に示します。

#include <iostream>
#include <cstdlib>

int main(int argc, char *argv[]){
    while(true){
        std::cout << "git> ";
        std::cout.flush();
        std::string command;
        std::getline(std::cin, command);
        if(command == "exit") break;
        std::system("git " + command);
    }

    return 0;
}

これはメモリから作成したものであり、コンパイラで確認しなかったことに注意してください。ささいな構文エラーがあるかもしれません。


ちょうど私の考え。Stack Overflowの誰もがこのようなプログラムを自分でコーディングできるはずです。プログラミング言語は重要ではありません。
Thomas Weller

@ThomasWeller私は間違いなく同意します。プログラムを投稿したのは、自分が話していることを正確に示すためであり、書くのが難しいプログラムだからではありません。
john01dav

9
プログラムにバグがなく、適切な量の機能が必要な場合は、このアプローチに多くの時間を費やすことになります。たとえば、最初のビルドエラーを修正した後(std :: system()はconst char *を必要とする)、EOFに無限ループがあることに気付くでしょう。履歴/読み取りラインのサポート、タブ補完、ディレクトリを変更するためのいくつかのビルトイン/環境変数の設定/シェルアウト/ ...などが必要な場合があります。既存のソフトウェア(この場合はgitshなど)がある場合は、それを使用しないのはなぜですか?
nomadictype

1
@nomadictypeそれは正当な批判ですが、他のソフトウェアを学ぶことも時間の約束です。このアプローチの利点は、わずか数分は、それが働いて得るために必要であり、それがどうなるTHSTされているということです正確にあなたが期待するか(変更を)何をしたいです。
john01dav

2
readline、行編集、履歴サポートの喪失、lsなどの単純なコマンドを実行できるため、4回のキーストロークよりもはるかにコストがかかるため、これで節約できます。
リーライアン

13

基本的なものについては、次のことができます:

function ggit(){ while true; do printf 'git> '; read; eval git $REPLY; done }
git> status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    deleted:    yarn.lock

no changes added to commit (use "git add" and/or "git commit -a")
git> add .
git> status
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    deleted:    yarn.lock

git>

ctrl + cで終了する


2
まともなアイデアですが、2つの問題があります。1つは、;事後処理がにつながることbash: syntax error near unexpected token です。2つ目は、そのeval部分が脆弱性になりやすいことです。たとえば、status;cat /etc/passwdこの小さなシェルに入力するとどうなるかを考えてみましょう。無害な例ですが、何が起こり得るかを理解しています。while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";doneこれを単純化することができます。もちろんこれは完全な証拠ではありませんが、1-シンプルであり、2-git以外のコマンドの実行を回避します(二重引用符により)。理想的ではなく、少しだけ良い
セルギーコロディアズニー

@Abigail Funny :)なぜそうなのか、シェル自体は最も安全なアプリケーションではありません。ファイルカットすることさえ問題になることがあります。しかし、私はもともと作っていた点は、我々はmysqlの通訳がいないせずに、シェルコマンドを実行して表示されていないということですsystemか、\!少なくとも最初に。この "repl"がgitコマンドのみを実行することが想定されている場合、実際にはそれ以上のことが可能です。
Sergiy Kolodyazhnyy

@Abigail私はこれが何をするか知っているので、恐れていません。しない他の人-してはいけないものを壊してしまうかもしれません。繰り返しになりeval ますが、特にユーザー制御の入力が関係する場合は、コマンドを実行するのに最適ではありません。
Sergiy Kolodyazhnyy

後のタイプミスを修正しましたdo。ありがとう!re:security:これは明らかに、個別のアプリケーションとして配布されることを意図していません。.bash_profilegitと入力したくない場合は、そのまま入力してください。私はそれが「安全でない」ことをあまり心配していません。理解できないもの(このonelinerスクリプトを含む)をbashに貼り付けると、悪い時間を過ごすことになります。シンプルで、書きやすく、読みやすく、改善も簡単なので、私はこれが好きです。
UmurKontacı19年

2

ConemuでWindows 7を使用しているとき、開発環境の起動スクリプトに以下を追加しました。

doskey g=git $*

これにより、とg入力する代わりにコマンドを使用できますgit。最後にWindows 10とConemuを試しましたが、うまくいきませんでした。バグがあると思いますが、試してみる価値はあります。


2

ブラケットエディタを使用すると、コードやgitコマンドを簡単に使用できます。また、多くの機能も備えています。

ここに画像の説明を入力してください

右上隅にある2番目の双眼鏡アイコンを使用して、拡張機能をインストールします。

ここに画像の説明を入力してください

brackets git上の画像のような拡張機能を検索してインストールします。

ここに画像の説明を入力してください

再び右上に4番目のアイコンが表示されるので、クリックして上の画像のような変更を確認します。

ブラケットをインストールする場合は、次のコマンドを使用します。

sudo add-apt-repository ppa:webupd8team/brackets
sudo apt-get update
sudo apt-get install brackets

詳細については、「Ubuntuにブラケットコードエディターをインストールする方法」および「UbuntupitのLinux Mintをインストールする方法」を参照してください

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