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

时间:2019-06-08 09:11:16

标签: git version-control command-line-interface git-bash

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

如果有一种方法可以在打开命令提示符进入“ Git模式” 之后的开始处只使用一次git命令,那就太好了。

例如:

git>

在此之后,我们键入的每个命令默认都被解释为Git命令。

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

mysql>

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

注意:我在Windows上使用的是git-bash

15 个答案:

答案 0 :(得分:190)

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

  

gitsh程序是git的交互式外壳。在gitsh中,您甚至可以使用本地别名和配置来发出任何git命令。

     
      
  • Git命令倾向于成组出现。避免在专用的git shell中一遍又一遍地输入git
  •   
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中用子命令包装任何程序。
  •   

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

答案 1 :(得分:115)

Perl单行代码可以做到这一点:

DB::table('navigation')->upsert(
    [
        ['id' => 1, 'name' => 'some navigation point', 'parent' => '0'],
        ['id' => 2, 'name' => 'some navigation point', 'parent' => '1'],
        ['id' => 3, 'name' => 'some navigation point', 'parent' => '1'],
    ],
    'id'
);

这将执行您键入的任何以perl -nE 'BEGIN {print "git > "} system "git $_"; print "git > "' 为前缀的内容。它将继续这样做,直到您按下git

答案 2 :(得分: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,依此类推。

答案 3 :(得分:32)

我非常喜欢在〜/ .bash_profile中为我的GitBash使用别名。如果您采用这种方法,这是我的一些最爱:

# 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'

答案 4 :(得分:31)

使用您的编辑器。

从您喜欢的编辑器(如vs code)中输入命令commit,并使用git更加有效。

enter image description here

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

enter image description here

答案 5 :(得分: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 :(得分:23)

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

complete -E -W git

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

答案 7 :(得分:21)

我知道这是一个很晚的答案,但这个问题确实引起了我的注意,因为我已经很久以来一直在应对这种重复。

我不确定您的身份,但老实说不要(我重复不要)要为每个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不会成为{{1} })

示例命令:

  1. git git init
  2. init
  3. add .
  4. stage .
  5. commit -m "inital commit"

其他信息(对于Linux用户):

如果需要,可以删除%run; %exit扩展名,并使用以下命令将其转换为可执行文件:

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

祝你好运。

答案 8 :(得分:17)

另一种适用于任何命令的方法:使用Ctrl + R(反向搜索)。

reverse-i-search允许您搜索命令历史记录。按下搜索字符串后,请重复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),等

答案 9 :(得分: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;
}

请注意,我只是从内存中写出来的,没有使用编译器进行检查。可能有语法错误。

答案 10 :(得分: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退出

答案 11 :(得分:2)

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

doskey g=git $*

有了这个,我可以只使用g命令而不是键入git。 最后,我尝试使用Windows 10和Conemu,它没有用,我认为有一个bug,但是值得一试。

答案 12 :(得分:2)

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

enter image description here

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

enter image description here

像上面的图片一样搜索扩展名brackets git,然后安装它。

enter image description here

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

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

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

有关更多信息,您可以阅读:How to Install Brackets Code Editor in Ubuntu and Linux Mint上的Ubuntupit

答案 13 :(得分:0)

从今天开始:GitHub CLI可用。

GitHub CLI将GitHub带到您的终端。它减少了背景 切换,帮助您集中精力并让您更轻松地编写脚本和 创建自己的工作流程。今年早些时候,我们宣布了 GitHub CLI。自从发布测试版以来,用户已经创建了 250,000个拉取请求,超过350,000个合并和超过 GitHub CLI有20,000个问题。我们收到了很多周到的建议 反馈,今天GitHub CLI已退出测试版,可用于 在Windows,macOS和Linux上下载。

答案 14 :(得分:0)

之后

while read -erp "*git*${PS1@P}" cmd rest; do 
        if _=`git help $cmd 2>&-`
                then eval git $cmd "$rest"
                else eval $cmd "$rest"
        fi
done

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

如果它看起来像一个,否则将按原样解释,因此您可以将git与其他命令混合使用,如果您想使用经过修改的命令,只需在其前面加上反斜杠即可,rm foo等于git rm foo,但是\rm foo将运行普通的rm命令。像往常一样^ d结束它。