虽然我的问题与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并且他们肯定是应该有所不同有什么想法我做错了什么以及如何让它真正起作用?
答案 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
。事实上,这是我的答案的第一行,使用push
或pull
- 我原本打算要求您使用pull
而不是fetch
。再次,真的很抱歉误传。
答案 1 :(得分:0)
最后我能够同步所有存储库,但我不得不摆脱fetch
并仅使用push
命令。
至于细节:
现在关于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拉。这一切都解决了我的问题。