我想知道是否有一种方法可以避免git
在每个Git命令的开头都键入单词。
如果有一种方法可以git
在打开命令提示符进入“ Git模式”后仅在开始时使用一次命令,那将是很好的。
例如:
git>
之后,默认情况下,我们键入的每个命令都将解释为Git命令。
与我们使用MySQL Shell编写数据库命令的方式类似:
mysql>
这将使我不必git
每天都要键入数百次。
注意:我git-bash
在Windows上使用。
我想知道是否有一种方法可以避免git
在每个Git命令的开头都键入单词。
如果有一种方法可以git
在打开命令提示符进入“ Git模式”后仅在开始时使用一次命令,那将是很好的。
例如:
git>
之后,默认情况下,我们键入的每个命令都将解释为Git命令。
与我们使用MySQL Shell编写数据库命令的方式类似:
mysql>
这将使我不必git
每天都要键入数百次。
注意:我git-bash
在Windows上使用。
Answers:
您可能要尝试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$
或查看链接到那里的其他项目:
注意:我自己没有使用过。
repl(1)
不是REPL。它不会评估或打印任何内容。它运行程序。
fork()
/ exec()
)所以repl(1)
甚至没有做那。
IO
操作,并执行包括副作用的操作,例如打印到终端连接的屏幕。
repl
不是独立的REPL;这是创建REPL系统的一种方法,该系统repl
仅是交互式组件。那公平吗?
这并不完全是您要的,但是您可以在您~/.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
,依此类推。
git hash-object
或者git interpret-trailers
?我只是将其作为替代方案,因为据我所知,这个问题所要问的确实不存在。
ci
for 之外,commit
我还使用shell别名g
作为git
,这减少了大多数键入操作,并使我停留在首选shell中。
我非常喜欢在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'
commit
或者push
因为我想要多一点时间(在输入时)来确保我不会破坏某些东西,所以我们不做任何准备
我的一个朋友制作了一个小的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
eval
在原始脚本源中使用并不是最好的主意。告诉您的朋友while IFS= read -r -p "git> " gitcmd; do [ "x$gitcmd" != "x" ] && git "$gitcmd";done
改用
这是另一种方式。它也不是所要求的,但是我已经使用了一段时间了,它非常不错。将以下行添加到您的~/.bashrc
:
complete -E -W git
现在在空的Bash提示符下按Tab键将输入“ git”。
~/zshrc
,对于tcsh,你就会把它在~/tcshrc
等
我知道这是一个很晚的答案,但是这个问题确实引起了我的注意,因为我已经在相当长的一段时间内一直在承受这种重复的痛苦。
我不确定您的身份,但是老实说我不想(我重复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
命令不执行任何操作即可关闭CLIctr+c
与跑步相同%run; %exit
git.history
与脚本位于同一文件夹中的文件中git
在命令的开始和脚本将不会复制它(EG: git init
不成了git git init
)init
add .
stage .
commit -m "inital commit"
%run; %exit
如果需要,可以使用以下方法删除.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'
祝好运。
适用于任何命令的另一种方法:使用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)等。
在您的示例中,将其与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;
}
请注意,我只是从内存中写出来的,并且没有使用编译器进行检查。可能存在语法错误。
对于基本内容,您可以执行以下操作:
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退出
;
事后做事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命令(使用双引号)。不理想,只是好一点
system
或没有\!
开始的情况下。如果假设此“ repl” git
仅执行命令,则实际上允许的范围更多。
eval
这不是运行命令的最佳方法,尤其是在涉及用户控制的输入时。
do
。谢谢!关于:安全性:这显然不是要作为单独的应用程序分发。.bash_profile
如果您不喜欢输入git,只需输入。我不太担心它是“不安全的”。如果将您不了解的东西粘贴到bash中(包括此oneliner脚本),那么您的日子将会很糟糕。我之所以喜欢它,是因为它简单,易于编写,易于阅读并且易于改进。
使用方括号编辑器,可以轻松使用您的代码和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。