Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自动将推送文件从一个GitHub存储库复制到另一个GitHub存储库_Git_Github_Github Api_Githooks - Fatal编程技术网

自动将推送文件从一个GitHub存储库复制到另一个GitHub存储库

自动将推送文件从一个GitHub存储库复制到另一个GitHub存储库,git,github,github-api,githooks,Git,Github,Github Api,Githooks,我有两个GitHub存储库 我希望在将文件推送到第一个存储库时自动(可能使用hook和/或githubapi)提交文件并将其推送到第二个存储库 第二个存储库不是第一个存储库的克隆,它们的文件夹布局不一定相同,只有一堆共同的文件 最简单的方法是什么 如果我不必安装http服务器或学习perl:)EDIT:我现在意识到问题是关于GitHub的。我的答案是关于您可以访问文件的标准git存储库 我假设第二次回购是第一次回购的复制品,是这样创建的 git clone --bare first.git se

我有两个GitHub存储库

我希望在将文件推送到第一个存储库时自动(可能使用hook和/或githubapi)提交文件并将其推送到第二个存储库

第二个存储库不是第一个存储库的克隆,它们的文件夹布局不一定相同,只有一堆共同的文件

最简单的方法是什么


如果我不必安装http服务器或学习perl:)

EDIT:我现在意识到问题是关于GitHub的。我的答案是关于您可以访问文件的标准git存储库

我假设第二次回购是第一次回购的复制品,是这样创建的

git clone --bare first.git second.git
将当前目录更改为
first.git
存储库中的目录,并将
second.git
添加为远程目录

cd first.git
git remote add second ../second.git
然后,在文件夹
first.git/hooks/
中创建一个名为
post-receive
(您可以重命名已经存在的
post-receive.sample
文件)

内容应该是这样的

#!/bin/sh
git push second
现在,当您将新提交推送到第一个存储库时,将立即执行从第一个到第二个的推送,这样第二个也会收到提交。

单独两个GitHub repo(没有第三方服务器监听webhook事件)无法相互镜像

您需要在一个GitHub repo上注册一个,以便检测推送事件,并推送到第二个GitHub repo

这意味着有一个服务器来监听webhook


像这样的工具可以帮助(在Go中)。

一个简单的方法是将两个(或更多)pushurl添加到
origin
(或其他远程)中

例如:

git remote set-url --add --push origin url1
git remote set-url --add --push origin url2
这对任何人的工作流程都不会有太大的改变,但对于两种回购协议,所有推送操作仍然有效地重复。对它的解释要详细得多


如果有很多人在处理同一回购协议,并且希望反映他们的更改,请尝试运行脚本为每个开发人员分配新的
pushurl
s。否则,恐怕您需要使用hooks+server。

由于您有不同的repo,您可以尝试使用git apply/git am逐个应用提交,然后推送

假设服务器上有Repo1.git和Repo2,Repo1.git是裸存储库,Repo2是第二个存储库的本地克隆

Repo1/.git/hooks/post-receive

#!/bin/sh
t=$(mktemp)
repo2_directory=/some/place/you/cloned/repo2
error=
while read line; do
  ref1=$(echo "$line"|cut -d' ' -f1)
  ref2=$(echo "$line"|cut -d' ' -f2)
  for ref in $(git log --oneline $ref1..$ref2); do
    git show -p --no-color --binary $ref > $t
    if !(cd $repo2_directory && git am -q < $t || (git am --abort; false)); then
      echo "Cannot apply $ref" >&2
      error=1
      break
    fi
  done
  [ -n "$error" ] && break
done
rm -f $t
[ -z "$error" ] && (cd $repo2_directory && git push)
Repo1/.git/hooks/post-receive
#!/垃圾箱/垃圾箱
t=$(mktemp)
repo2_directory=/some/place/you/cloned/repo2
错误=
读行时;做
参考1=$(回显“$线”|切割-d'-f1)
参考2=$(回声“$线”|切割-d'-f2)
对于$中的ref(git日志--单行$ref1..$ref2);做
git show-p--无颜色--二进制$ref>$t
如果!(cd$repo2|u目录和&git-am-q<$t||(git-am-abort;false));然后
echo“无法应用$ref”>&2
错误=1
打破
fi
完成
[-n“$error”]&中断
完成
rm-f$t
[-z“$error”]&&(cd$repo2_目录和git推送)

如果您正在寻找功能强大且易于维护的产品,我鼓励您开发一种解决方案。是的,它需要您部署一个HTTP服务器,比如一个HTTP服务器,并且需要少量的开发(您的需求相当具体),但是我认为如果您需要可靠且低维护的东西,它会有回报的。如果您在考虑了这些方法和设置工作后,认为这种文件镜像方法仍然是正确的做法,那么就可以这样做

让源存储库(在GitHub上)为
S1
S2
。。。将(非重叠)文件集镜像到
F1
F2
…,发送到目标repo
T
(也在GitHub上),其中相应的文件被视为只读文件。您的需求是不寻常的,因为
Sn
T
听起来好像不是彼此克隆的,它们甚至可能没有任何公共提交,在这种情况下,这不是推送/获取场景。您还不能保证每次提交一次源文件更新,甚至不能保证源文件更新分组但与非复制更改隔离,因此这与提交无关

复制的触发器是将某些文件推送到
S1
S2
…,而不是提交这些repo的任何开发人员克隆,因此客户端钩子不会有帮助(而且维护起来可能会很麻烦)。GitHub当然不允许通用钩子,所以Webhook是最好的解决方案。你可以考虑另一个轮询克隆,它经常从<代码> S1……执行逻辑,然后提交给T,但是这听起来比Web挂钩更笨拙,这会给你可靠的传递、重放能力、体面的审计痕迹等等。 好处是有很多已经构建的基础设施支持这种类型的设置,因此您需要编写的实际代码可能非常小。假设您使用
Node.js
类型设置:

  • 部署。这个很酷的小库是GitHub Webhooks的预构建处理程序,它处理HMAC
    X-Hub-Signature
    验证,并为所有Webhooks事件提供简单的事件侦听器钩子。每个S可以有一个端点,或者更容易将它们串联起来
  • 有一些本地文件(保存在Git repo中),它将
    Sn
    映射到
    Fn
  • X-GitHub-Event:push
    注册处理程序,并检查
    repository/name
    committes[]/modified[]
    中与本地地图匹配的路径
  • Deploy是for Node.js的一个实现
  • 对于每个匹配的文件:
    • 调用从Sn读取文件的
      utf-8
      base64
      副本
    • 调用以在
      T
      中重新创建该文件
    • 对T进行一系列调用,以执行(当前提交),(从基础和新blob创建一个新的),最后。这是一个工作流程——较低的冲突是分支/合并
    <