Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.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
Svn 使用git作为实时镜像_Svn_Git_Rsync_Mirroring - Fatal编程技术网

Svn 使用git作为实时镜像

Svn 使用git作为实时镜像,svn,git,rsync,mirroring,Svn,Git,Rsync,Mirroring,我有本地计算机(A)、测试服务器(B)和存储库服务器(C)。 我有以下工作流程: 在计算机上编写代码 将后视镜更改为测试机器B 如果它运行良好,请从B提交到C 目前,我使用rsync进行镜像,但由于存储库不断增长,从B获取文件列表需要一些时间(~10秒)。我想使用Git而不是rsync,因为这样速度会快得多,而且我将拥有存储库C的本地历史记录 问题是我还没有找到任何用git进行实时镜像的方法。我能行 git add . && git commit -m "mirroring" &

我有本地计算机(A)、测试服务器(B)和存储库服务器(C)。
我有以下工作流程:

  • 在计算机上编写代码
  • 将后视镜更改为测试机器B
  • 如果它运行良好,请从B提交到C
  • 目前,我使用rsync进行镜像,但由于存储库不断增长,从B获取文件列表需要一些时间(~10秒)。我想使用Git而不是rsync,因为这样速度会快得多,而且我将拥有存储库C的本地历史记录

    问题是我还没有找到任何用git进行实时镜像的方法。我能行

    git add . && git commit -m "mirroring" && git push
    
    在本地计算机上,但服务器呢

    每隔几秒钟就有一次工作

    git checkout | awk '{print $2;}' | git checkout
    
    正确的方法


    附言:我是git的新手,也许有更适合这个工作的工具。

    为正确的工作使用正确的工具。我会使用
    unison
    或类似的方法来进行镜像


    我还将从A而不是B进行提交。因此,您可以跳过在测试环境中镜像.git目录,这将使其更快。然后,您可以留下更多有意义的提交消息,说明更改了什么以及更改的原因。。。我不认为有必要使用镜像工具,git似乎非常适合这样做。 正如fseto所说,我还建议提交A。将更改复制到C应该使用
    gitpush
    。然后,你需要了解的是,既然B有一个工作树,推动它肯定不是一个好办法。您只能(至少应该)推送到裸存储库(没有工作树的存储库:服务器C上应该有什么)

    相反,在B上,您可以从A获取更改(B是A的git克隆)。当然,这可以在cronjob上设置。这将几乎是一个
    git pull
    ,除了您希望始终从服务器a反映
    ,即使您在a上的分支之间切换、删除提交、分支等。因此,在B上,我将使用以下命令:

    git fetch origin ; git checkout origin/HEAD
    
    此命令将警告您,因为它将创建一个“分离头”状态,但这没关系,因为您不想在B上提交

    最后,服务器部分:

  • 在C上:通过
    gitinit--bare创建服务器repo
  • 在B(或A?):将服务器添加为远程服务器:
    git远程添加服务器
  • 在B(或A?):如果一切正常,则将更改推送到服务器,例如:
    git-push-server-HEAD:master
    。我写这封信是为了表达我的一般性,但你可能想用一个分支来代替

  • 希望我的解释可以理解……:)

    使用Git的实时镜像可以通过

    您可以设置
    update
    hook,它可以在更新分支后执行操作rigt。在服务器B上设置此连接。每次将更改推送到
    B
    的站点时,都会启动此连接。在这个钩子中,您可以将更改向前推到
    C
    (您应该为其创建一个远程链接)。钩子看起来像这样:

    #!/bin/bash
    git push remote-of-c $3:$1
    [ $? -ne 0 ] && { 
      echo 'Mirroring failed, check server settings and try again.'
      exit 1
    }
    
    因此,每次更新
    B
    C
    也会得到更新。如果在推送过程中出现故障,您将在控制台中看到相关消息,并且您的初始推送将不会成功。这就是所谓的“镜像”,不是吗