Eclipse 通过pendrive共享git存储库
虽然我的问题看起来类似于,但我使用pendrive代替GitHub,我还有两个备份。好吧,让我在下面描述一下 我将开普勒与EGit和命令行git一起使用,在同一台计算机“C1”的另一个磁盘分区上有本地repo“L1”(带工作集)和远程裸repo“R1”。L1配置为推/拉至R1或从R1拉出。此外,我在pendrive“PD”上创建了R1的裸克隆“P”,因此P被配置为从R1获取。在另一台计算机“C2”上,我制作了一个P的克隆“R2”,所以R2被配置为获取/推送表单/到P,然后使用repo“L2”(带工作集)将项目表单R2签出到Eclipse中,所以L2被配置为获取/推送表单/到R2。它基本上是在pendrive的帮助下在两台计算机之间交换更改,并且在两台计算机上都有裸备份。看起来是这样的:Eclipse 通过pendrive共享git存储库,eclipse,git,Eclipse,Git,虽然我的问题看起来类似于,但我使用pendrive代替GitHub,我还有两个备份。好吧,让我在下面描述一下 我将开普勒与EGit和命令行git一起使用,在同一台计算机“C1”的另一个磁盘分区上有本地repo“L1”(带工作集)和远程裸repo“R1”。L1配置为推/拉至R1或从R1拉出。此外,我在pendrive“PD”上创建了R1的裸克隆“P”,因此P被配置为从R1获取。在另一台计算机“C2”上,我制作了一个P的克隆“R2”,所以R2被配置为获取/推送表单/到P,然后使用repo“L2”(带
C1: {L1, R1}; PD: {P}; C2: {R2, L2};
L1 <--pull push--> R1 <--push fetch--> P <--push fetch--> R2 <--push pull--> L2
#!/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;
其配置如下:
C1: {L1, R1}; PD: {P}; C2: {R2, L2};
L1 <--pull push--> R1 <--push fetch--> P <--push fetch--> R2 <--push pull--> L2
#!/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;
L1 R1 P R2 L2
在序列
commit(L1).push(R1)
,p.fetch(R1)
,R2.fetch(p)
之后,git说R2和p是最新的,但是我对L1进行了commit,它们肯定会有所不同。有什么想法吗?我做错了什么,以及如何让它真正起作用?你需要做一个R1.push(p)
或p.pull(R1)
R1.push(p)
和p.pull(R1)
之间没有区别,除了前者中,push
必须在R1
中运行,因此p
必须是R1
中的遥控器,而在后者中,pull
必须从P
运行,因此R1
必须是P
中的遥控器
p
当前未完全更新,您仅获取更改,未合并它们
至于局域网/有限网络问题,您可以尝试将bitbucket用于私有存储库,github用于公共回购。两个位置都应提供其中一个
编辑
我刚刚意识到我的打字错误花费了OP大量的调试工作——我是说
p.pull(R1)
更早,而不是p.fetch(R1)
。真的很抱歉。pull
可以被认为是一次操作中的fetch
+merge
。事实上,这是我回答的第一行,使用推
或拉
——我本想让你使用拉
,而不是取
。再一次,非常抱歉沟通不畅。最后我能够同步所有存储库,但我必须摆脱fetch
并且只使用push
命令
有关详情:
- L1(由Eclipse管理,EGit位于C1上)配置为从R1拉/推/到R1
- R1(由C1上的命令行git管理)配置为推送到P
- P配置使用了一个技巧,我将在后面解释
- R2配置为推送至P
- L2配置为从R2拉出/推送到R2
B.fetch(A)
(两个回购协议都是空的)。所以当我把某物推到P(从R1或R2)
为了与其他远程设备(如R2或R1)同步,我从P执行推送,但我只是
在推送之前更改远程URL。为此,我准备了一个bash脚本(push all.sh
)
看起来是这样的:
C1: {L1, R1}; PD: {P}; C2: {R2, L2};
L1 <--pull push--> R1 <--push fetch--> P <--push fetch--> R2 <--push pull--> L2
#!/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上有两个文件(如果需要,可以更多)包含了repos的路径
扩展名为*.url的远程计算机(实际上可以是任何内容):
在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拉过来的。所有这些都解决了我的问题。我不明白为什么会出现这样的复杂情况:你没有局域网,或者你不能设置连接而不是携带pendrive?这些计算机位于不同的位置(彼此之间大约4公里),它们不共享局域网,并且网络连接有限。事实上,它不是一个选项,因此pendrive.至于
P.pull(R1)
,它意味着获取和合并,但R1和P是裸存储库。merge
是否适用于此处?对于裸存储库:R1.push(P)
和P.fetch(R1)
之间有什么区别?我可能仍然错过了一些git概念…我认为您也需要合并您的更改,fetch本身不会更新。此外,在R1.push(P)
和P.fetch(R1)
之间没有区别,除了在前者中,push
必须在R1
中运行,因此P
必须是R1
中的远程,而在后者中,pull
必须从P
运行,因此R1
必须是P
中的遥控器。感谢您的解释,当我到达另一台计算机并返回到这台计算机时,我会尝试一下。经过一些尝试,我相信R1.push(P)之间一定有一些功能上的差异
和P.fetch(R1)
,但就Git而言,我的知识还不足以抓住这一差异。好吧,当在两个方向上进行推压时,它实际上是起作用的。如果往一个方向推,从另一个方向取,我仍然会遇到问题。可能是由于一些配置问题。但是我准备了一个答案和解决方案,可能对与我类似的人有用。@Cromax我刚刚意识到我的打字错误花费了你大量的调试工作-我在前面的评论中是指P.pull(R1)
,而不是