如何保持两个git存储库同步?

时间:2013-01-17 01:41:35

标签: git

以下是该方案。我有两台机器,“桌面”和“笔记本电脑”。

在桌面上我做:

mkdir git_test
cd git_test
git init
dd if=/dev/urandom of=test.img bs=1k count=1000
git add test.img
git commit -m "Added first image"

然后在笔记本电脑上我做:

git clone [USER]@desktop:/home/[USER]/git_test    
cd git_test
dd if=/dev/urandom of=test2.img bs=1k count=1000
git add test2.img
git commit -m "Added second image"

然后我希望桌面上的git repo看起来像我笔记本电脑上的git repo。在笔记本电脑上,我发出以下内容:      git push origin master

但后来我得到了:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

如何保持这两个回购同步?

错误消息似乎暗示git具有我想要的功能,但由于某种原因,它似乎是一个更高级的工作流程。我听说有人说你不能推到你目前所在的分支机构,有人可以详细说明这个可能的解决方案吗?我对这种性质的解决方案没有任何问题,即我可以在我的笔记本电脑上的某个分支上工作,在我的桌面上使用不同的分支,然后以某种方式同步这些分支以使它们完全相同。

请注意以下内容!

  • 出于几个原因,我不想像github那样使用集中式仓库。首先是安全。第二是简单。第三是由于我不会进入这里的情况,我不能指望有一个互联网连接到一些远程服务器,我只有我的两台机器通过局域网连接。最后,我想学习如何以我在这里要求的方式做事,以获得特定的知识。

  • 我也不想使用裸仓库,因为一个裸仓库在根目录中有一堆残骸。这是丑陋和混乱。我从subversion转向git的全部原因是git看起来像一个更清洁,分散的解决方案。此外,我有一些非技术人员将在桌面的根目录中运行,他们会因为这个问题而感到困惑。 git的美丽(我认为)所有内容都隐藏在.git文件夹中。编辑:显然我对这一点还不够清楚。想象一下,我有一个带有以下子文件夹的“Documents”文件夹:mydata1和mydata2。这不是一个人为的例子,这正是我试图解决的问题。 mydata1应该只包含“test.img”和该文件,但现在它包含:

    分支 配置 描述 头 挂钩 信息 对象 参

我希望能够只是cd到mydata1并开始编辑文件,但我必须尝试通过分支机构,或者甚至只是为了完成工作。为“文档”中的每个子文件夹提供这种目录结构是不可行的。拜托,请不要告诉我这样做。请回答这个问题。感谢。

这两点是我发布此问题的整个原因。如果您对此问题有答案,请回复。 :)谢谢!!

4 个答案:

答案 0 :(得分:10)

这样做的一种方法是拉,而不是推。在第一台机器上安装了两台机器之后:

git remote add origin [USER]@laptop:/home/[USER]/git_test
git pull # Complains about untracked branch while adding the branch you want to track
git branch --set-upstream master origin/master
git pull

现在你可以从任何一台机器上提取。如果你想推动,我不知道如何通过分散设置来实现这一目标。

答案 1 :(得分:2)

我可能会错过为什么你不想使用裸仓库,我相信只有拉动解决方案应该可以正常工作,但我也相信“傻瓜”仍然可以隐藏在你工作时的方式一个光鲜的回购。

在桌面上,如果您:

mkdir git_test
git init --bare git_test

然后:

git clone bare_repo_directory new_location

您可以从克隆中正常推送到裸仓库(默认情况下将其作为原点引用),并且没有人必须处理它包含的额外内容;克隆只有.git目录。

要推动你需要运行:

git push origin master (assuming you're working out of master)

对于您的笔记本电脑:

git clone [USER]@desktop:path_to_bare

克隆副本中的工作应该是正常的。你将从原点(这是裸仓)进行推拉,但你不需要直接使用它。

答案 2 :(得分:1)

推送不起作用的原因正是你提到的。默认情况下,如果该存储库(接收推送的远程)当前工作空间指向同一分支,则无法进行操作。因此,如果您的遥控器当前已检出master,您将无法转到master

两个快速解决方案:

如果你已经在repo中提交任何提交,只需直接签出一个哈希,这将使你处于无头状态,这意味着你不在任何分支:

> git checkout <any-hash>
Note: checking out '<any-hash>'.

You are in 'detached HEAD' state...

使用全新仓库的另一种方式,如果您想要推送到master,只需将该初始分支更改为其他未命名为master的分支:

> git symbolic-ref HEAD refs/heads/non-existent

这将使您在新的存储库中处于与master类似的状态,在没有提交的分支中。只是你不会抓住主人,因此它将被允许接受推动。

答案 3 :(得分:1)

我最近遇到的问题是我的服务器和桌面不同步。在网上搜索了一段时间之后,我找不到能够处理我的确切情况的答案。所以我打电话给Rackspace支持,他们能够为我提供我认为比我能在网上找到的更好的答案。

这个特别的帖子最接近我的问题,所以我想我会分享我在这里解决问题的方法,以防将来有人遇到同样的问题。

以下是出了什么问题

我正在尝试为Magento安装Sweet Tooth插件,然后按照我们通过安装Magento扩展的常规步骤进行操作。这意味着将一堆文件放入我的App,JS和Skin目录中。

在app / design / adminhtml目录中有一个“base”文件夹。如果你对Magento一无所知,那么你知道他们有关于搞乱基本文件的大量警告。简而言之 - 不要这样做。

我认为,由于我的本地仓库没有“基本”目录,我可以把它放在我的本地机器上。不幸的是,令我沮丧的是,这意味着当我添加它时添加了一个“基本”目录,其中只包含Sweet Tooth的文件。当我把它放在服务器上时,它擦除了我的整个基本目录和Boom!下去了Magento。

幸运的是,我可以使用以下救生命令恢复到以前的服务器状态:

  

git reset --hard HEAD @ {1}

此命令会将您带回上一次提交,并立即恢复正常。当然,现在我的服务器和桌面都不同步,因为我的服务器现在已经落后了一次。

添加侮辱伤害我犯了一个非常愚蠢的错误,并从我的计算机上删除了扩展名的文件,并在我的桌面上做了​​另一次提交,所以现在服务器和桌面由于两次提交而不同步,git现在有了这些文件在它的缓存中。

以下是我解决的方法

显然这会让你陷入一个非常烦人的地方,因为在我的服务器上执行git pull会每次都擦除我的“base”目录。此外,由于提前两次提交,我不能只回滚一次提交。

我打电话给Rackspace,在这一点上我认为是神,并找到了两种不同的解决方法,具体取决于你是想从服务器端还是桌面端执行此操作。

事实证明,你真的不能从服务器端做到这一点,因为文件现在不再在桌面上了。虽然他们建议做一个git commit -a,然后从服务器进行推送,然后从桌面拉一下就行不通,文件不再在桌面上了。

所以你必须从桌面修复它,你需要从缓存中获取这些darn文件。

从桌面修复同步问题

为了从缓存中取出文件,我发出了以下命令,一遍又一遍,直到我删除的文件也被根据git删除。

  

git rm -r - 目录的高速缓存/文件夹/目录

  

git rm - 文件的文件夹/文件夹

现在这已经超出缓存了,我能够做一次提交,最后让git知道这些文件实际上已经消失了。

接下来是对主人的推动。然后剩下要做的就是从服务器和中提琴拉回来,重新开始营业!

**结论和经验教训**

这里吸取的教训是一些重要的内容,我正在为其他有类似问题的程序员写这篇文章,并提醒我不要再做什么了。

  1. 如果您的本地仓库中没有服务器上的文件夹,请不要将其添加到本地仓库,只包含少量文件,这样就会将目录清零。服务器

  2. 如果您不小心搞砸了,请务必使用git删除文件,不要将其从本地文件系统中删除

  3. git rest --hard HEAD @ {1}有时可能是你最好的朋友

  4. 我希望这可以帮助处于类似情况的其他人。我花了几个小时在网上搜索文档,却找不到任何有关我遇到的复杂问题的内容,所以如果我可以帮助别人节省一些时间并减少一些白发,那么我的噩梦将为世界带来一些好处。 !