如何避免在每个Git命令的开头键入“ git”?


190

我想知道是否有一种方法可以避免git在每个Git命令的开头都键入单词。

如果有一种方法可以git在打开命令提示符进入“ Git模式”后仅在开始时使用一次命令,那将是很好的。

例如:

git>

之后,默认情况下,我们键入的每个命令都将解释为Git命令。

与我们使用MySQL Shell编写数据库命令的方式类似:

mysql>

这将使我不必git每天都要键入数百次。

注意:git-bash在Windows上使用。


87
对于那些因偏离主题而投票决定关闭的人,请阅读您单击的文本:“关于通用计算硬件和软件的问题对于Stack Overflow而言是偏离主题的,除非它们直接涉及主要用于编程的工具。 ”。Git是程序员使用的工具。事实证明,它在此站点上具有自己的标签。
JBentley

5
你为什么这么多输入“ git”?您的IDE应该在按键时具有强大的vcs集成。您是每天输入50次“ git pull”还是ctrl-t ... 当您不需要成为命令行战士时;)
vikingsteve

8
@vikingsteve实际上,所有 git帮助和知识都是通过命令行给出的。
艾德·兰德尔

6
@vikingsteve我输入了很多,因为它速度更快。我输入〜100wpm,如果我像与Git一样熟悉按键,则输入更多。与单击GUI相比,它更容易。您最喜欢的IDE可能具有键盘快捷键。那对你很好。当<M-Tab> git blah <CR>已经在我的肌肉记忆中时,为什么我会浪费时间学习它们?
Fund Monica的诉讼案

3
应该有一个“应该关闭此问题,因为用户正在问一个没有意义的问题”-就像我明白了您要问的一样,但是外壳如何知道要输入“非以git command”(如果确实有一种方法可以执行此操作)。
user3728501

Answers:


190

您可能要尝试gitsh。从他们的自述文件中:

gitsh程序是git的交互式shell。从内部gitsh您可以发出任何git命令,甚至可以使用本地别名和配置。

  • Git命令倾向于成组出现。git通过在专用的git shell中运行它们,避免一遍又一遍地输入:
sh$ gitsh
gitsh% status
gitsh% add .
gitsh% commit -m "Ship it!"
gitsh% push
gitsh% ctrl-d
sh$

或查看链接到那里的其他项目:

  • git-sh-具有Git提示,别名和完成的自定义bash shell。
  • gitsh-用Perl编写的简单Git外壳。
  • repl-在REPL中用子命令包装任何程序。

注意:我自己没有使用过。


22
抱怨 ... repl(1)不是REPL。它不会评估或打印任何内容。它运行程序。
凯文

11
@Kevin读取用户请求,评估用户请求(通过运行程序),并打印程序的输出。这也是贝壳所做的。
Yakk-Adam Nevraumont

2
@ Yakk-AdamNevraumont:不,它肯定不会“打印程序的输出”。它挂钩程序的标准输出到终端,然后该程序打印它自己的输出-除了程序的stdout已经迷上了终端(在自动继承fork()/ exec())所以repl(1)甚至没有做
凯文

6
@Kevin我理解您的观点,但是对REPL的严格定义将排除大多数使用各种语言的口译“ REPL”。您只能使用纯功能语言来确保评估没有副作用,但是即使在Haskell中,“ REPL” GHCi在默认情况下也将接受IO操作,并执行包括副作用的操作,例如打印到终端连接的屏幕。
大约

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标记,因此不足为奇)。
康拉德·鲁道夫

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

57

这并不完全是您要的,但是您可以在您~/.bashrc最常用的Git命令中设置一些shell别名:

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
除了cifor 之外,commit我还使用shell别名g作为git,这减少了大多数键入操作,并使我停留在首选shell中。
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
哪里提交:P
qwr

14
我不包括在内,commit或者push因为我想要多一点时间(在输入时)来确保我不会破坏某些东西,所以我们不做任何准备
JacobIRR

3
除非您使用强制推送,否则提交和推送不应破坏任何内容。但是我尝试事先使用git status。
qwr

1
这也是我所做的+1。尽管我很想尝试gitsh,因为其他答案都提到了
CoffeeTableEspresso

1
@CoffeeTableEspresso我尊重您承认一些击键是保存更新和销毁项目之间的区别的事实。
LogicalBranch

31

使用您的编辑器。

commit从喜欢的编辑器(如vs代码)中键入命令,并使用git更加有效:

在此处输入图片说明

或键入git以获取所有命令:

在此处输入图片说明


13
我对所有这些否决感到惊讶。对于使用支持这些功能的IDE的人来说,这不是一个糟糕的答案。
Glen Pierce

4
我认为人们已经投票否决了,因为不是每个人都使用/喜欢VS-Code。无论哪种方式,我都认为这是一个不错的解决方案,因此我+1。
LogicalBranch

4
@LogicalBranch,人们通常从命令行使用git,我知道这一点,但是某些编辑器内部存在git支持,值得尝试。
prosti

1
我不喜欢这个答案,因为不是每个人都使用VS代码(我个人不喜欢它),但不会拒绝投票,因为这对于使用它的ppl是一个很好的解决方案。
CoffeeTableEspresso

1
@CoffeeTableEspresso,如果您使用的是Sublime,则有一个名为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改用
Sergiy Kolodyazhnyy

23

这是另一种方式。它也不是所要求的,但是我已经使用了一段时间了,它非常不错。将以下行添加到您的~/.bashrc

complete -E -W git

现在在空的Bash提示符下按Tab键将输入“ git”。


5
请注意,如果您使用的是其他外壳,则必须将其放入适当的文件中。例如,对于zsh的,你把它放在~/zshrc,对于tcsh,你就会把它在~/tcshrc
TheOnlyMrCat

20

我知道这是一个很晚的答案,但是这个问题确实引起了我的注意,因为我已经在相当长的一段时间内一直承受这种重复的痛苦。

我不确定您的身份,但是老实说我不想(我重复DO N'T)想为每个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是一个简单的python脚本,可以防止不必要的重复“ git”关键字。

说明文件:

  • %undo命令从堆栈中删除最后一个命令
  • %run命令在堆栈中运行命令并清除堆栈
  • %exit命令不执行任何操作即可关闭CLI
  • 按下ctr+c与跑步相同%run; %exit
  • 该脚本将已执行的命令保存到git.history与脚本位于同一文件夹中的文件中
  • 您可以使用分号在一行中添加多个命令
  • 您可以使用关键字git在命令的开始和脚本将不会复制它(EG: 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

附加信息(适用于懒惰的人):

如果您懒惰并且不想键入a,./则可以将此脚本移至/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(反向搜索)。

反向搜索允许您搜索命令历史记录。按下搜索字符串后,请重复Ctrl + R以进一步搜索相同的字符串。

您只需要键入一次命令,然后就可以从该命令的任何子字符串中调用该命令。在大多数情况下,您只需两到三个放置适当的搜索字母就可以调用整个非常长的命令及其各种变体。除了正常使用外壳程序外,不需要任何预配置,并且它是您使用外壳程序的自适应方式,只需键入一次完整命令,命令就会自动添加到您的命令历史记录中。

  • 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,而且适用于使用readline库的许多程序(并且有很多),例如Python shell,IPython,mysql shell,psql shell,irb(ruby)等。


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上存在无限循环。您可能需要历史记录/阅读线支持,制表符补全,一些内置文件来更改目录/将环境变量设置为env vars / shell out / ...等。如果有现有软件(在这种情况下为gitsh),为什么不使用它?
nomadictype,

1
@nomadictype这是一个有效的批评,但是学习其他软件也是一种时间投入。这种方法的优点是只需花费几分钟即可使其工作,并且它将完全按照您的期望或期望(带有更改)进行操作。
john01dav

2
Readline的丢失,行编辑,历史记录的支持,能够运行ls之类的简单命令等,将使您比四次击键花费更多的钱,所以您节省了这笔钱。
Lie Ryan

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
体面的想法,但是有两个问题。一是;事后做事bash: syntax error near unexpected token ;二eval是容易产生漏洞。例如,考虑如果我键入status;cat /etc/passwd这个小外壳会发生什么。无害的示例,但您知道会发生什么。您可以将其简化为while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";done:当然,这不是防弹的方法,但是1-比较简单,而2-避免执行非git命令(使用双引号)。不理想,只是好一点
Sergiy Kolodyazhnyy

@Abigail Funny :)为什么呢,shell本身不是最安全的应用程序。甚至连文件都可能是个问题。但是,我最初提出的观点是,我们没有看到mysql解释器执行shell命令,至少在没有system或没有\!开始的情况下。如果假设此“ repl” git仅执行命令,则实际上允许的范围更多。
Sergiy Kolodyazhnyy

@Abigail我不害怕,因为我知道这是做什么的。其他不这样做的人可能最终会破坏他们不应该做的事情。同样,eval 这不是运行命令的最佳方法,尤其是在涉及用户控制的输入时。
Sergiy Kolodyazhnyy

修正了打字错误do。谢谢!关于:安全性:这显然不是要作为单独的应用程序分发。.bash_profile如果您不喜欢输入git,只需输入。我不太担心它是“不安全的”。如果将您不了解的东西粘贴到bash中(包括此oneliner脚本),那么您的日子将会很糟糕。我之所以喜欢它,是因为它简单,易于编写,易于阅读并且易于改进。
UmurKontacı19年

2

当我将Windows 7与Conemu一起使用时,我在开发环境启动脚本中添加了以下内容:

doskey g=git $*

这样,我可以只使用g命令而不是输入git。最后,我尝试使用Windows 10和Conemu,但无法正常工作,我认为有一个bug,但值得尝试。


2

使用方括号编辑器,可以轻松使用您的代码和git命令,还具有许多功能。

在此处输入图片说明

右上角的第二个双目图标用于安装扩展程序。

在此处输入图片说明

搜索扩展名brackets git(如上图所示)并安装它。

在此处输入图片说明

再次在右上角显示第四个图标,因此只需单击并查看更改,如上图所示。

如果要安装支架,请使用以下命令:

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

有关更多信息,您可以阅读:如何在Ubuntu上安装Brackets Code Editor和Ubuntupit安装Linux Mint

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.