如何将本地Git存储库移至远程Git存储库


68

我在本地计算机上有各种Git项目。我有一台服务器要用作远程Git存储库。如何保持本地历史记录完整无缺,将本地Git存储库(项目)移到服务器上?

谢谢!

编辑:感谢所有伟大的答案。对于我有限的GIT知识,我选择的答案很有意义。

编辑#2:我注意到我原来的答案选择没有复制我的标签。git push --mirror <path>复制标签。

Answers:


68

在您的服务器上,将git仓库创建为裸仓库

git init --bare repo.git

然后,推送本地存储库的提交

git push --mirror ssh://yourserver/~/repo.git

如果我这样做,那么有人可以克隆我的仓库吗?(如果他们知道地址)
slides_alpha

@sliders_alpha:如果他们对您的服务器具有SSH访问权限,并且存储库具有适当的权限,则可以。
knittl

2
关于这个有很多废话。感谢您的最佳和简便方法!
Tobias

这根本不适合我,否则我会误解这个问题。git init --bare repo.git创建一个名为repo.gitgit的文件夹。我为什么要那个?我想我想要一个文件夹“ repo”,里面有一个“ .git”文件夹,就像我过去使用过的100多个仓库一样。如果我这样做,git init --bare repo/.git我会得到带有“ .git”的“ repo”。但是后来我开始努力。在服务器上,我收到了一个无法使用的回购协议,其中包含许多fatal: This operation must be run in a work tree“正确答案”。
gman

1
答案是缺少具有可用克隆的步骤,您必须在远程计算机上克隆裸存储库。
weberjn

62

首先,在服务器上创建一个git repo

git init --bare /path/to/repo

然后将远程仓库添加到本地仓库(ssh://或https://)

git remote add origin ssh://server/path/to/repo

并且,推送文件/提交

git push origin master

最后,推送标签

git push origin --tags

2
我更喜欢这一点,因为--mirror选项(来自git help :)“新创建的本地引用将被推送到远程端,本地更新的引​​用将在远程端被强制更新,而已删除的引用将从远程端删除。 。”
caligari13年

这对我不起作用。fatal: This operation must be run in a work tree如果我尝试执行任何操作,则远程回购协议会收到各种错误
gman

这对我来说效果很好,我还添加了用于推送标签的行。注意:ssh://协议也可以是https://。
Mike Kormendy

感谢您的支持,并对此表示赞赏。:)我想知道您是否愿意通过解释“起源”可以是任何名称来改善此答案,但是通常使用的就是这个名称。(我处于从原点撤出,修改本地存储库并完全推向其他存储库的情况。)
Ken Ken

这个例子是最好的,但它留下不跟踪新的远程裸回购原来的本地仓库......您可以修复与git branch --set-upstream-to=origin/master master
SO恶臭

12

Ralf Wernders博客上有一个很好的教程。假设您知道如何在服务器上创建存储库,或者已经完成:

git remote add <remote> <url>

要将远程添加到本地存储库。<remote>是远程服务器的名称(通常是“来源”)。<url>是具有写访问权的存储库的URL(例如git @ ...)

git push <remote> <branch>

将提交移至原点。<branch>是您要推送的分支(通常是“主”)。


这个问题不是关于github的。关于git
gman

如果要推拉,可以添加git push --set-upstream origin master
zevero

4

在服务器上创建一个git存储库(您可以使用gitolite / gitosis或仅使用普通用户帐户+ pubkey ssh auth),使用以下命令将服务器添加到本地git存储库中

git remote add name url

并使用git push -u name master-u将当前分支标记为跟踪,因此可以git pull代替git pull name master)。

在服务器端(基于Debian的系统):

adduser --system --home /home/git --bash /bin/bash git
su - git
mkdir .ssh
cat yourkey.pub > .ssh/authorized_keys

现在,使用以下命令为每个本地存储库创建一个新的裸存储库

mkdir projectName
cd projectName
git init --bare

之后,该网址将为git@yourserver:projectName


它要求输入密码,所以我必须使用什么密码?
法瓦德(Fawwad)'17

4

如果您有一个独立的本地工作树存储库(其中带有“ .git”文件夹的文件夹),则要将远程添加到:

  1. 在遥控器中创建一个新的空存储库。
  2. 在本地存储库中,将新的远程设置为源:

    cd localrepo

    git remote add origin REMOTEURL#(使用git remote -v验证)

  3. 将所有本地分支推送到远程,并设置每个本地分支以跟踪相应的远程分支:

    git push --all --set-upstream origin#(通过git branch -vv验证)

  4. 将所有本地标签推送到远程:

    git push-标签起源

此时,本地存储库的行为将与从远程克隆中复制的一样。


如果您有一个裸露的本地存储库(名称以.git结尾的文件夹),而您只想复制到远程服务器上:

  1. 在遥控器中创建一个新的空存储库。
  2. 在本地存储库中,将其所有分支推送到远程

    cd localrepo.git

    git push --all REMOTEURL

  3. 将所有本地标签推送到远程:

    git push --tags REMOTEURL


3

如果您想要一个普通的(例如:不裸)存储库,只需复制它即可。没有什么特别的需要做。

如果要在服务器上使用裸存储库,只需在服务器上对其进行初始化,然后将其添加为“本地”副本上的远程存储,然后推送至该存储库即可。(git push --mirror一切都会通过。)


这对我不起作用。在远程mkdir somefolder; cd somefolder; git init。论地方文化git push --mirror ssh://remote/somefolder。结果remote: error: refusing to update checked out branch: refs/heads/master
gman

0

也许这是“倒退”,但我一直都做

git clone --bare localrepo localrepo.git
scp -r localrepo.git remoteserver:/pathTo
mv localrepo localrepo-prev
git clone remoteserver:/pathTo/localrepo

证明新的仓库很好,带有git status / log等,让我感觉更好

将不受版本控制的所有文件从-prev移到新的localrepo

rm -rf localrepo.git localrepo-prev

0

我有一个带有提交日志的本地仓库。我想将其添加到一个新的github远程存储库中,并保留所有提交日志。方法如下:

  1. 在github上创建远程仓库。然后从“克隆或下载”绿色按钮获取仓库URL,例如 https://github.com/mhisoft/eVault.git

  2. 如果本地回购附加到旧的原始文件。首先将其删除

    git remote remove origin

  3. 从命令行添加现有存储库

    git remote add origin https://github.com/mhisoft/eVault.git

    git push -u原始主机

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.