git存储库在计算机之间同步时,何时移动?


89

假设我有一台台式电脑和一台笔记本电脑,有时我在台式机上工作,有时我在笔记本电脑上工作。

来回移动git存储库的最简单方法是什么?

我希望git存储库是相同的,这样我就可以在另一台计算机上我离开的地方继续。

我想确保两台计算机上都具有相同的分支和标签。

谢谢约翰

注意:我知道如何使用SubVersion做到这一点,但是我对git如何工作感到好奇。如果更简单,我可以将第三台pc用作经典服务器,两台pc可以同步。

注意:两台计算机都在运行Linux。


更新

因此,让我们尝试XANI的想法:在服务器上使用裸露的git repo,并使用KingCrunch的push命令语法。在此示例中,有两个客户端和一个服务器。

因此,让我们首先创建服务器部分。

ssh user@server
mkdir -p ~/git_test/workspace
cd ~/git_test/workspace
git --bare init

因此,然后我尝试从其他计算机之一获取带有克隆的回购副本:

git clone user@server:~/git_test/workspace/
Initialized empty Git repository in /home/user/git_test/repo1/workspace/.git/
warning: You appear to have cloned an empty repository.

然后进入该仓库并添加一个文件:

cd workspace/
echo "test1" > testfile1.txt
git add testfile1.txt
git commit testfile1.txt -m "Added file testfile1.txt"
git push origin master

现在,服务器已使用testfile1.txt更新。

无论如何,让我们看看是否可以从另一台计算机上获取此文件。

mkdir -p ~/git_test/repo2
cd ~/git_test/repo2
git clone user@server:~/git_test/workspace/
cd workspace/
git pull

现在我们可以看到测试文件了。

此时,我们可以使用更多内容对其进行编辑,然后再次更新服务器。

echo "test2" >> testfile1.txt
git add testfile1.txt
git commit -m "Test2"
git push origin master

然后,我们回到第一个客户端并进行git pull查看更新的文件。现在,我可以在两台计算机之间来回移动,如果愿意,可以添加第三台计算机。


同步脚本可自动执行使用git快速从PC1到PC2同步的过程,并且数据使用率低,甚至在手机wifi热点上(此用例的速度比rsync快数百倍!):stackoverflow.com/questions / 4948190 /…
加布里埃尔·斯台普斯

Answers:


27

我认为,有多种方法。我会描述一下我该如何处理

我有一台上网本作为24/7服务器,其中包含多个git存储库。从/到那里,我通过SSH推和拉更改。要从外部访问,请使用dyndns.org。它工作正常,特别是因为我有两个以上的系统,需要访问某些存储库。

更新:一个小例子。可以说我的上网本叫做“上网本”。我在那里建立一个仓库

$ ssh username@netbook.local
$ cd ~/git
$ mkdir newThing
$ cd newThing
$ git init --bare

然后,在桌面上,我将为其创建一个副本。也许我还会添加一些文件

$ git clone username@netbook.local:/home/username/git/newThing
$ git add .
$ git commit -m "Initial"
$ git push origin master

在便携式计算机上,我将(首先)执行相同的操作,但是对于远程访问(从LAN外部),我还将添加外部地址。

$ git clone username@netbook.local:/home/username/git/newThing
$ git remote add externalName username@mydyndns.home-ip.org:/home/username/git/newThing
$ git pull externalName master

它只是git(/ git工作流)工作的方式。您可以根据需要添加任意多个远程存储库。没关系,如果两个或多个引用相同的“物理”存储库。您不需要自己的本地“服务器”,可以使用具有ssh访问权限的任何公共服务器。当然,如果您不需要外部访问,则根本不需要公共服务器。裸存储库也可以位于桌面系统上,然后您可以在本地文件系统中创建工作副本存储库。

$ mkdir myRepo; cd myRepo
$ git init --bare
$ cd /path/to/myProject
$ git remote add origin /path/to/myRepo
$ git add .; git commit -m "Initial"; git push origin master

这就是我处理此问题的方式,对我来说,它工作得很好(如果不是很完美;)

读点东西:http : //progit.org/真是一本好书。


当您使用不同的方式进入仓库时,会是什么样?您想举例说明您的答案吗?
约翰

谢谢,这些例子澄清了很多:)
约翰·约翰(Johan)

6

我会将存储库从一个盒子克隆到另一个存储库,然后设置两个存储库,以便我可以git fetch从另一个盒子中复制。

将遥控器从重命名为origin另一个框的名称使遥控器分支更易于阅读。

请注意,仅使用git fetch(而不是git push),这对于非裸存储库就可以很好地工作:

[user@foo repo]$ git fetch -v bar

[user@bar repo]$ git fetch -v foo

5

最简单的方法:使用创建中央仓库--bare(所以没有签出文件,只有.git东西)或github

“分布式”将如下所示:

建立:

  1. 在笔记本电脑上: git remote add desktop ssh://user@desktop/home/user/repo/path
  2. 在台式机上: git remote add laptop ssh://user@laptop/home/user/repo/path

正在同步:

git pull laptop/desktop (在非裸仓库中,push不能很好地工作,因为当推送到远程仓库时,git不会修改检出的文件)

或者,在pendrive上进行回购;)


我尝试使用--bare仓库,但无法正确完成整个工作流程。
约翰

我只是从git开始,然后从本地git转到github,然后再返回就可以了,但是我无法使用计算机到计算机的方法。愚蠢的问题-我使用什么证书user?对于github,我只需要添加rsa-pub密钥。我尝试将克隆请求者计算机的rsa-pub添加到known_hosts,但这并不能解决问题……
Dave

对于我而言,这是在两个本地计算机之间进行同步而又不需连续访问远程服务器的最简单方法。
johnzachary 2012年

1

简单使用rsync怎么样?


3
我使用rsync多年来保持三台服务器同步。它可以工作,但是rsync不能让您在同步完成后回滚更改。我还以这种方式丢失了许多文件,因为我没有足够近地读取空运行输出,并且rsync设置为删除主服务器上不存在的文件。从那以后,我开始使用git并发现它是使重要目录保持同步的一种更安全的方法。
Cloudkiller

1

您不能只在GitHub,BitBucket或GitLab上创建一个远程存储库吗?(后两家公司提供无限的免费私人存储库)。当您完成一天的工作后,只需使用git push将所做的更改推送到远程存储库即可。到家后,只需git pull要将所做的更改从工作中拉到家用计算机上即可。同样,当您在家中完成工作时,再做一次git push,然后在您回到工作中时,请做git pull


1

在两台计算机之间来回移动git存储库的最简单方法是什么?

方案1:我仅在PC1上工作(编辑代码和文件),但希望在PC2上也有文件的副本(例如:建立整个代码库)。

在使用<25 MB数据的同时,通过wifi热点在不到1分钟的时间内从PC1同步到PC2:

我在随身携带的一台较弱的计算机(笔记本电脑)上工作,但在其他地方使用的功能更强大的计算机上工作。我一直使用git使用脚本从笔记本电脑同步到另一台计算机。我只需键入以下命令即可运行它:

sync_git_repo_from_pc1_to_pc2

而已!即使使用手机wifi热点并处理数十GB的存储库,通常也需要大约25 MB的数据和约30秒到1分钟的时间。我被ssh'ed到PC2,所以我git log -1在PC2上进行验证同步是否有效,然后运行build命令。完美运作。试一试。有关详细信息,请参见下面的链接。

注意:PC2上的克隆存储库将位于名为的git分支上somename_SYNC。如果您希望脚本具有相同的分支名称,而不是始终使用“ SYNC分支”,则可以对其进行适当的修改。如果需要,可以修改脚本以获得更像下面的方案2的效果。不过,手动执行方案2并不难,因此您可能只想继续手动执行方案2。在方案1中,自动化脚本是最有益和最省时的,因为它允许在PC1上进行“修改”,在PC1上运行“同步”但又影响到的简单,快速的“修改,同步,构建”工作流。 PC2,并且在PC2上进行“构建”。

链接:

  1. 此处提供了完整的设置和安装说明:
    通过SSH通过Eclipse处理远程项目
  2. 自述文件,文档和此处的仓库: https : //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/README_git-sync_repo_from_pc1_to_pc2.md
  3. 有问题的确切脚本在这里:https :
    //github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles/blob/master/useful_scripts/sync_git_repo_from_pc1_to_pc2.sh

方案2:我在多台计算机上工作(编辑代码和文件),并且希望能够从世界上任何一台计算机上编辑同一代码存储库:

我希望git存储库是相同的,这样我就可以在另一台计算机上我离开的地方继续。我想确保两台计算机上都具有相同的分支和标签。

  1. 转到https://github.com并创建一个帐户,并可选地(推荐)设置ssh密钥

  2. 现在,使用其Web界面创建一个新的存储库。

    1. 从2020年或更早的一年开始,GitHub也允许免费的私有存储库,因此,即使对于私有的,封闭源代码的项目,它也很好用。
  3. 找到新的存储库ssh或https克隆URL。例如:git@github.com:ElectricRCAircraftGuy / eRCaGuy_dotfiles.git或https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git

  4. 将项目克隆到PC1上。例如:

     git@github.com:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
     cd eRCaGuy_dotfiles
    
  5. 并在PC2上重复该完全相同的克隆命令。

  6. 现在在PC1上,进行一些更改,将其提交,然后将其推送到github上的“远程”存储库中:

     # edit some files, then do the following
     git add -A  # stage ("add") all changed files to be committed 
     git commit  # commit them
     git push    # push them to your remote github repo
    
  7. 现在在PC2上,进行更改:

     # pull all changes from github (which includes the changes
     # you just pushed from PC1) to PC2
     git pull  
    
  8. 现在,您可以在PC2上编辑文件,提交文件,并使用上面仅显示两个步骤的命令将它们推送到github,然后从PC1可以运行git pull以从PC2提取这些更改。

  9. 在PC1或PC2上继续按要求执行此过程,并轻松共享文件并在两台计算机之间分配工作。只需记住,您必须先将所有更改提交并在一台PC上推送到github,然后才能将它们检出(拉出)并继续在另一台PC上工作。

  10. 如果您遇到两台PC之间的文件有点不同步的情况,则可能不得不使用一些额外的分支,进行一些合并,解决冲突等。然后,它变得与工作更加相似与一个小团队一起工作,你们都在同一个仓库中工作。Google是您的朋友。Git非常非常强大,并且具有几乎所有内容的命令,命令集或工作流。


0

好了,您可以(通过Git)将服务器推拉到可能设置的服务器上。或者,您可以将您的存储库存储在GitHub上,并将其用作同步桥。


0

您可以在任何计算机(可能是台式机)上创建存储库,然后从便携式计算机及其本身将其推入/拉入。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.