我如何避免键入“;吉特;在每个Git命令的开头?

我如何避免键入“;吉特;在每个Git命令的开头?,git,version-control,command-line-interface,git-bash,Git,Version Control,Command Line Interface,Git Bash,我想知道是否有办法避免在每个git命令的开头键入单词git 如果在打开命令提示符进入“git模式”后,有一种方法在开始时只使用一次git命令,那就太好了 例如: git> 在这之后,我们键入的每个命令默认解释为Git命令 与我们使用MySQL shell编写数据库命令的方式类似: mysql> sudo cp ./git /bin/nogit sudo chmod +x /bin/nogit alias nogit='/bin/nogit' sudo add-apt-repos

我想知道是否有办法避免在每个git命令的开头键入单词
git

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

例如:

git>
在这之后,我们键入的每个命令默认解释为Git命令

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

mysql>
sudo cp ./git /bin/nogit
sudo chmod +x /bin/nogit
alias nogit='/bin/nogit'
sudo add-apt-repository ppa:webupd8team/brackets
sudo apt-get update
sudo apt-get install brackets
这样我就不用一天打几百次
git


注意:我在Windows上使用。

这不是您想要的,但是您可以在
~/.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
,依此类推。

您可能想试试。从他们的自述:

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

  • Git命令往往是成组的。通过在专用git shell中运行,避免反复键入git:
或者看看其他与此相关的项目:

  • -一个定制的bashshell,带有Git提示符、别名和补全
  • -一个用Perl编写的简单Git shell
  • -将任何带有子命令的程序包装在REPL中

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

一个Perl one liner,它将完成以下操作:

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

这将执行您键入的任何内容,前缀为
git
。它会一直这样做,直到你点击
^D

这里是另一种方法。它也不完全符合要求,但我已经使用了一段时间,它非常好。将以下行添加到
~/.bashrc

complete -E -W git

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

在您的示例中,将其与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;
}
#包括
#包括
int main(int argc,char*argv[]){
while(true){

std::cout我非常喜欢在我的GitBash的~/.bash_配置文件中使用别名。如果你采用这种方法,下面是我的一些最爱:

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

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

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

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

  • git提交——修改
    am
  • git pull
    pu
  • git-rebase-rebase合并-i-到origin/development-origin/development-feature/blue header
    blu
  • git-rebase——中止
    ab
  • git-rebase——继续
    con
  • docker compose stop&&git pull&&make&&docker compose up-d
    up

此外,Ctrl-R不仅适用于bash,还适用于许多使用readline库的程序(有很多),如Python shell、IPython、mysql shell、psql shell、irb(ruby)等。

我的一个朋友制作了一个小bash脚本来实现这一点。它被称为


我知道这是一个很晚才回答的问题,但这个问题确实给我留下了深刻的印象,因为我已经处理了相当长一段时间这种重复的痛苦

我不确定您的情况,但老实说,我不想为每个
git
命令创建别名,因此我编写了一个名为的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)
是一个简单的python脚本,用于防止不必要地重复“git”关键字

文档:
  • %undo
    命令从堆栈中删除最后一个命令
  • %run
    命令运行堆栈中的命令并清除堆栈
  • %exit
    命令将关闭CLI,而不执行任何操作
  • ctr+c
    与运行
    %run;%exit
  • 脚本将执行的命令保存到与脚本相同的文件夹中名为
    git.history
    的文件中
  • 可以使用分号在一行中添加多个命令
  • 您可以在命令开头使用关键字
    git
    ,脚本不会复制它(例如:
    git init
    不会变成
    git git init
命令示例:
  • init
  • 添加。
  • stage.
  • commit-m“初始提交”
  • %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'
    
    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>
    
    doskey g=git $*
    
    sudo add-apt-repository ppa:webupd8team/brackets
    sudo apt-get update
    sudo apt-get install brackets
    
    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