如何创建一个git钩子来修改然后镜像git存储库?

时间:2016-03-21 03:29:56

标签: git github gitlab githooks

我的dotfiles here有一个GitHub存储库。

它包含一个installdotfiles.sh脚本,用于从GitHub安装dotfiles。我想在GitLab上有另一个git存储库用于备份(以及非常酷的自定义语法突出显示:P),镜像此存储库,除了在存储库上运行shell命令:

grep -rl raw.githubusercontent . | 
      xargs sed -i ''
     's/raw.githubusercontent/gitlab/g'; grep -rl 'dotfiles/master' . |
      xargs sed -i '' 's/dotfiles\/master/dotfiles\/raw\/master/g'

将Github的链接替换为GitLab的相应链接。

基本上,如果我推送到我的GitHub dotfiles存储库,我会自动更新GitLab存储库,除了先在存储库上运行脚本,所以我的GitLab存储库包含GitLab链接。

我如何实现这样的钩子?

我听说这可以使用Git Hooks来实现,但是我不熟悉它们,并且阅读它们,我并不完全理解这样做是怎么做的。

PS如果两种方式都有效会很好 - 所以当我推送到GitLab时,GitHub将运行一个不同的脚本,用GitHub链接替换GitLab链接,这样每当我推送到一个时,都会相应地更新。

2 个答案:

答案 0 :(得分:1)

最简单的方法是让您的脚本installdotfiles.sh使用您设置的变量(在调用脚本之前),具体取决于您要获取文件的存储库。

例如:

origin=github curl https://raw.githubusercontent.com/thepiercingarrow2/dotfiles/master/installdotfiles.sh | sh
# or
origin=gitlab curl https://gitlab.com/thepiercingarrow2/dotfiles/raw/master/.bash_profile | sh

这意味着您的脚本包含一个简单的测试:

remote="raw.githubusercontent.com/thepiercingarrow2/dotfiles"
if [[ "${origin}" == "gitlab" ]]; then
   remote="gitlab.com/thepiercingarrow2/dotfiles/raw"
fi

#bash_profile
curl -# https://${remote}/master/.bash_profile > ~/.bash_profile

换句话说,你真的不需要git钩子。任何一种。

答案 1 :(得分:0)

  

我如何实现这样的钩子?

您可以选择任何您喜欢的挂钩,并查看文件中的链接。

例如,你可以使用这样的东西,并在if条件之后添加你的脚本。

pre-receive hook

#!/bin/sh

# Check to see if this is the first commit in the repository or not
if git rev-parse --verify HEAD >/dev/null 2>&1
then
    # We compare our changes against the previous commit
    against=HEAD^
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi

# Redirect output to screen.
exec 1>&2

# Get the list of files which were commits
# assuming the other files are already contains the right values and does not need to be updated
files = $(git diff-tree -r --name-only $against )

# ... do whatever you want to do with the files
  

PS如果两种方式都有效会很好 - 所以当我推送到GitLab时,GitHub将运行一个不同的脚本,用GitHub链接替换GitLab链接,这样每当我推送到一个时,都会相应地更新。

在每个存储库上设置2个挂钩,i,每个存储库上都有正确的链接。

另一种不使用钩子的方法:

如果您可以在客户端使用本地代码,则可以在git中使用此功能:

  

事实证明,您可以编写自己的过滤器,以便在提交/结帐时在文件中进行替换。   这些被称为 clean smudge 过滤器。

enter image description here

在这里阅读所有相关内容:
https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#Keyword-Expansion