电脑间如何同步git仓库,当你需要在不同电脑间移动时?

94

假设我有台台式电脑和笔记本电脑,有时候我会在台式电脑工作,有时候我会在笔记本电脑工作。

最简单的方法是如何在这两台电脑之间移动git仓库呢?

我想让git仓库保持一致,以便我可以在另一台电脑上继续工作。

我希望确保两台计算机都有相同的分支和标签。

谢谢 Johan

注意:我知道如何使用SubVersion进行此操作,但我很好奇如何使用git。如果更容易的话,我可以使用第三台计算机作为传统服务器,让这两台电脑进行同步。

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


更新:

那么我们来试试XANI的想法,使用一个裸的git仓库作为服务器,并使用KingCrunch的push命令语法。在这个示例中,有两个客户端和一个服务器。

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

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

于是我从其他电脑尝试通过克隆(clone)来获取代码库的副本:

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快数百倍!):https://dev59.com/e2445IYBdhLWcg3wRoPH#61109889 - Gabriel Staples
8个回答

31

我认为有多种方法可以处理这个问题,我将描述一下我是如何处理的。

我有一台netbook作为24/7服务器,其中保存着多个git存储库。我通过SSH在此处推送和拉取更改。为了从外部访问,我使用dyndns.org。这很好用,特别是因为我有超过两个系统需要访问某些存储库。

更新:一个小例子。 假设我的netbook叫做"netbook"。我在那里创建一个存储库。

$ 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

在我的便携设备上,我会(首先)做同样的设置,但是对于远程访问(从我的局域网之外),我还需要添加外部地址。

$ 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
谢谢,那些例子解释得非常清楚 :) - Johan

7

最简单的方法:使用--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(在非裸仓库上推送不会很好用,因为Git不会在推送到远程仓库时修改已检出的文件)

或者,在U盘上创建仓库;)


我尝试使用 --bare 仓库,但是我无法正确地完成整个工作流程。 - Johan
我刚开始接触 Git,目前已经能够在本地 Git 和 Github 之间进行转换,但是在计算机之间进行传输的方法我无法使用。愚蠢的问题——我应该使用哪些凭据作为“user”?对于 Github,我只需要添加 rsa-pub 密钥。我尝试将克隆请求方计算机的 rsa-pub 添加到 known_hosts 中,但这并没有起作用... - Dave
这是我在两台本地机器之间同步而不需要不断连接远程服务器的最简单方法。 - johnzachary

6
我会将代码库从一个盒子克隆到另一个盒子,然后设置这两个代码库,以便我可以从另一个盒子中只使用git fetch
将远程名称从origin更改为另一个盒子的名称使得远程分支更易于阅读。
请注意,仅使用git fetch(而不是git push),这对非裸代码库很有效。
[user@foo repo]$ git fetch -v bar

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

2
问题:如何在两台计算机之间轻松地移动git代码库?

场景1:我仅在本地电脑1上工作(编辑代码和文件),但也希望在远程电脑2上有一个文件的副本。

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

我使用一台性能较弱的笔记本电脑进行编程,并在其他地方的一台性能更好的计算机上构建。 我经常使用Git脚本将文件从笔记本电脑同步到另一台计算机。 我只需键入以下命令即可运行它:

sync_git_repo_from_pc1_to_pc2

就是这样!即使使用手机wifi热点并在一个几十GB大小的repo上工作,通常也只需要约25MB的数据和30秒到1分钟的时间。我通过ssh连接到PC2,在PC2上运行git log -1来验证同步是否成功,然后运行构建命令。完美地运行了。试一试吧。详细信息请参见下面的链接。
注意:PC2上克隆的repo将位于名为somename_SYNC的git分支上。如果您希望它具有相同的分支名称而不总是使用“SYNC分支”,请适当修改脚本。如果需要,可以修改脚本以获得类似下面场景2的效果。然而,手动执行场景2并不难,所以您可能只想继续手动执行场景2。这就是自动化脚本最有益和省时的情况1,它允许轻松快速地进行“修改、同步、构建”工作流程,其中“修改”发生在PC1上,“同步”从PC1运行但同时也影响PC2,而“构建”则在PC2上进行。
链接:
  1. 全面设置和安装说明:
    通过SSH在Eclipse上使用远程项目
  2. 自述文件、文档和repo: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. Go to https://github.com and create an account and optionally (recommended) set up ssh keys.

  2. Now use their web interface to create a new repository.

    1. As of the year 2020 or earlier, GitHub allows free private repositories too, so this works well even for private, closed-source projects.
  3. Find the new repository ssh or https clone URL. Ex: git@github.com:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git or https://github.com/ElectricRCAircraftGuy/eRCaGuy_dotfiles.git.

  4. Clone the project onto PC1. Ex:

     git@github.com:ElectricRCAircraftGuy/eRCaGuy_dotfiles.git
     cd eRCaGuy_dotfiles
    
  5. And repeat that exact same clone command on PC2.

  6. Now on PC1, make some changes, commit them, and push them to your "remote" repository on 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. Now on PC2, pull in your changes:

     # pull all changes from github (which includes the changes
     # you just pushed from PC1) to PC2
     git pull  
    
  8. Now you can edit files on PC2, commit them, and push them to github using the commands shown just 2 steps above, and then from PC1 you can run git pull to pull in those changes from PC2.

  9. Keep doing this process, as required, working on PC1 OR PC2, and easily sharing the files and splitting your work between the two computers. Just remember that all your changes must be committed and pushed to github on one PC before you can check them out (pull them) and continue working on the other PC.

  10. If you ever get into a situation where files are a bit out-of-sync between the two PCs, you'll have to maybe use some extra branches, do some merges, resolve conflicts, etc. Then, it becomes more similar to working with a small team where you are all working on the same repo. Google is your friend. Git is very very very powerful, and has a command, set of commands, or workflow for just about everything.


2

你不妨在GitHub、BitBucket或GitLab上创建一个远程仓库吗?(后两个公司提供无限制的免费私人仓库)。当你下班后,只需使用git push将更改推送到远程仓库。回到家后,只需运行git pull将工作场所的更改拉取到家中的机器上。同样地,当你在家完成工作后,执行git push,然后回到工作时,执行git pull


4
用这种方法的问题在于它会强制你将未完成的工作提交(会出现在提交历史记录中),只是为了将代码传输到另一台机器上。我正在寻找一种几乎与你提到的方式一样简单的方法,但不会创建那些垃圾提交,并避免使用带有git push的危险的-f选项来覆盖垃圾“传输”提交。 - Pulseczar
3
你可以使用一个临时分支来进行工作(工作进展分支)。当你准备好提交到主干分支时,请将WIP上的提交压缩成一个,并合并到主干分支。 - Michael Fulton
问题不在于如何处理那些处于进行中的提交。问题在于我需要记得去做这些提交。有时候我在桌面上开始了某个工作,然后离开了,一直到我坐在公共汽车上的笔记本电脑上才继续。如果没有提交这些正在进行中的工作,远程桌面基本上是将这些内容传输到我的笔记本电脑上的唯一方法。 - Alexander
这是正常情况,但对我来说并不完全适用。我之所以遇到这个问题,是因为我在PC1上留下了未提交的工作,然后离开了一个星期。我没有记得那些待处理的更改,并且我开始在PC2上工作,而没有将这些更改合并到git分支中-->我认为我已经解决的问题再次出现了。 - fillobotto

2

直接使用 rsync 怎么样?


4
多年来,我一直使用rsync来保持三个服务器的同步。它确实有效,但rsync并没有提供撤销更改的方法。由于我没有仔细阅读dry-run输出,并且rsync被设置为删除主服务器上不存在的文件,所以我也因此失去了很多文件。之后,我改用git,发现它是一个更安全的保持重要目录同步的方法。 - Cloudkiller

0

好的,您可以通过 Git 推送和拉取代码到您可能设置的服务器。或者您可以将您的代码库存储在 GitHub 并使用它作为同步桥梁。


0

您可以在任何一台计算机上创建存储库,可能是桌面计算机,并从笔记本电脑和自身进行推送/拉取。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接