通过pendrive共享git存储库

时间:2014-02-11 09:24:45

标签: eclipse git

虽然我的问题与this one类似,但我使用pendrive而不是GitHub,我也有两个备份。好吧,让我在下面描述一下。

我使用带有EGit和命令行git的Kepler,并在同一台计算机“C1”上的另一个磁盘分区上使用本地repo“L1”(带工作集)和远程裸仓“R1”。 L1配置为向/从R1推/拉。此外,我在pendrive“PD”上创建了R1的裸克隆“P”,因此P配置为从R1获取。在另一台计算机“C2”上我创建了一个P的克隆“R2”,所以R2被配置为获取/推送表单/到P然后使用repo“L2”(带工作集)将项目表单R2签出到Eclipse中,所以L2是配置为获取/推送表单/到R2。它基本上是服务器,可以在pendrive的帮助下在两台计算机之间交换更改,并在两台计算机上进行裸备份。它看起来像这样:

C1: {L1, R1}; PD: {P}; C2: {R2, L2};

配置如下:

L1 <--pull push--> R1 <--push fetch--> P <--push fetch--> R2 <--push pull--> L2

在序列commit(L1).push(R1)之后,P.fetch(R1) R2.fetch(P) git说R2和P是最新的,但是我做了承诺L1并且他们肯定是应该有所不同有什么想法我做错了什么以及如何让它真正起作用?

2 个答案:

答案 0 :(得分:1)

您需要执行R1.push(P)P.pull(R1)

R1.push(P)P.pull(R1)之间没有区别,但前者push必须在R1中运行,因此P必须是R1中的遥控器,而后者pull必须从P运行,因此R1必须是P中的遥控器。

P目前尚未完全更新,您只提取了更改,但没有合并它们。

至于LAN /有限网络问题,您可以尝试使用bitbucket作为私有存储库,github用于公共存储库。两个地方都应该可以使用。

修改

我刚刚意识到我的错字导致了OP大量的调试工作 - 我的意思是P.pull(R1),而不是P.fetch(R1)。真的很抱歉。在单个操作中,pull可以被视为fetch + merge。事实上,这是我的答案的第一行,使用pushpull - 我原本打算要求您使用pull而不是fetch。再次,真的很抱歉误传。

答案 1 :(得分:0)

最后我能够同步所有存储库,但我不得不摆脱fetch 并仅使用push命令。

至于细节:

  • L1(由Eclipse管理,在C1上使用EGit)配置为从/向R1拉/推
  • R1(由C1上的命令行git管理)配置为推送到P
  • P配置使用技巧,我稍后会解释
  • R2配置为推送到P
  • L2配置为从/向/ /向R2推送/推送

现在关于P配置:正如我所说,看起来A.push(B)的工作方式有点不同 比B.fetch(A)(两个回购都是裸的)。所以当我把东西推到P(从R1或从R2) 并且想要与其他遥控器(如R2或R1)同步,我从P执行推送,但我只是 在推送之前更改远程URL。为此,我准备了一个bash脚本(push-all.sh) 看起来像这样:

#!/bin/bash
url=`cat $1.url`;
for f in *.git
do
    cd $f;
    echo "Setting URL to $url$f";   
    git remote set-url origin $url$f;
    git push;
    cd ..;
done;

请注意,我的所有裸存储库都在目录名末尾有* .git。

在这个pendrive上有两个文件(如果需要的话可能会更多),这些文件包含了回收路径 具有扩展* .url的远程机器(实际上可以是任何东西):

$ cat c1.url
d:\my\path\on\c1\git\

$ cat c2.url
e:\another\path\on\c2\

在git url下的C1和C2上我有另一个push-all.sh脚本,但有点简单:

#!/bin/bash
for f in *.git
do
    cd $f;
    git push;
    cd ..;
done;

所以现在,当我完成C1的工作时,我确保pendrive连接到计算机并且它已经完成 与R1配置中的字母相同,我这样做:

$ cd /d/my/path/on/c1/git
$ ./push-all.sh

现在我的所有工作都从R1复制到P.然后,当我到达计算机R2时,我会这样做:

$ cd /p/git-repo-on-pendrive
$ ./push-all c2

然后我从EGit拉出来,我的所有变化都有。当我完成C2的工作时,我做了:

$ cd /e/another/path/on/c2
$ ./push-all

当我到达C1时,我会这样做:

$ cd /q/git-repo-on-pendrive
$ ./push-all c1

我从EGit拉。这一切都解决了我的问题。