编写自己的Git子命令

类固醇猫(James Kang)

Git别名很好,对吗? 我的意思是,请快速浏览以下两个命令,并告诉我您想记住哪一个:

  $ git log --cherry-mark --left-right master ... feature-branch 
  $ git lc master ...功能分支 

简单的选择! 现在,如果要传递任何参数怎么办? Git得到了支持:

  #将以下内容放入.gitconfig中 
[别名]
lc =“!fn(){\
git log-\“ $ 1 \” --oneline \
-樱桃标记-左右-
\“ $ 2 \”;
}; fn”
  #现在您可以像这样使用它 
$ git lc 10 master ...功能分支

多么酷啊?

如果您想执行更复杂的任务怎么办? 假设您需要将本地分支与origin / masterorigin / best-of-all-features同步; 然后您可能会执行以下操作:

  #括号中的名称表示您当前所在的分支 
  (所有功能中的最好)$ git stash -u;  git pull 
(所有功能中的最好)$ git checkout master; git pull
(master)$ git checkout所有功能中的最好功能
(所有功能中的最好)$ git merge master --no-edit
(所有功能中的最好)$ git stash pop

添加几个参数,然后您就把.gitconfig搞砸了…… 大功告成 ! 那么,如何解决呢?

扩展Git

好吧,Git允许您定义自定义函数并将其作为子命令运行,这几乎是别名的工作方式。 但是,您可以利用其中的整个shell环境,甚至包括$ PATH中公开的任何脚本。 您听说过git-flow扩展吗? 他们利用此功能为Git提供扩展功能。

动手:您的第一个Git子命令

所以,让我们开始吧。 首先,要为脚本创建一个可执行文件,并将其放在$ HOME的新文件夹中:

  $ mkdir〜/ .gitbin; 触摸〜/ .gitbin / git-custom 
$ chmod u + x〜/ .gitbin / git-自定义

请注意,文件名的前缀是git-始终这样命名脚本是非常重要的; 这就是Git知道您的文件应该作为子命令运行的方式。

现在,将新文件夹添加到外壳的$ PATH中

  $ export PATH =“ $ HOME / .gitbin:$ PATH” 

您可能希望将前一行添加到Shell的初始化文件中(可以是〜/ .zshrc,〜/ .bashrc或正在运行的任何CLI)。 接下来,在编辑器中打开〜/ .gitbin / git-custom ,并编写以下内容:

  #!/ usr / bin / env红宝石 
讯息= ARGV [0]
放消息

保存文件,然后转到命令行; 您现在可以运行git custom’Hello world’并在终端的输出中看到Hello world 。 惊人!

另外,您是否注意到我使用哪种语言编写脚本? 是的,您说得对…露比! 只要您有口译员,您就可以很好地使用您选择的编程语言,并让您的想象力做剩下的事情。

当然,这是一个简单的示例,因为我的目的是教您如何使脚本可供Git使用。 但是,我将为您提供指向我的dotfiles的链接,您可以在其中找到git-browse函数。 它有什么作用? 好吧,他们说一张图片值一千个字-在这种情况下,是一个GIF:

使用自定义git命令浏览到存储库的远程URL

结论

您已经看到了扩展Git的难易程度,并使它几乎可以运行脚本语言允许您编写的任何任务。 从改进日志记录到将本地分支与其远程对等方和节点进行同步和重新定级,这些选项非常丰富。

我希望您发现这很有用,并提出一些邪恶的想法将Git提升到另一个层次。 玩得开心!