2012-01-23 246 views
47

我有我的本地机器上的各种Git项目。我有一台服务器,我想用作我的远程Git存储库。如何将我的本地Git存储库(项目)移动到我的服务器,同时保持历史记录不变?如何将我的本地Git存储库移动到远程Git存储库

谢谢!编辑: 感谢您的所有伟大的答案。我选择的答案对我有限的GIT知识是有意义的。

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

回答

52

在您的服务器创建一个Git仓库裸仓库

git init --bare repo.git 

然后,把你的本地仓库的提交

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

如果我这样做,任何人都可以克隆我的回购?(如果他们知道地址) –

+0

@sliders_alpha:如果他们具有SSH访问您的服务器并且存储库具有适当的权限,那么是的。 – knittl

+1

有这么多狗屎。感谢最好的和简单的方式! – Tobias

3

如果您想要一个正常的(例如:不是裸露的)存储库,只需复制它。没有什么特别的事情需要去做。

如果要在服务器上使用裸存储库,只需在服务器上初始化它,将其作为远程“本地”副本进行初始化,然后将其推送到该服务器。 (git push --mirror将打通了一切。)

+0

这并不适用于工作我。在远程,'mkdir somefolder; cd somefolder; git init'。在本地'git push --mirror ssh:// remote/somefolder'。结果'远程:错误:拒绝更新检出分支:refs/heads/master' – gman

7

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

git remote add <remote> <url> 

将远程添加到本地存储库。 <remote>是远程(通常是“起源”)的名称。 <url>是url与写访问你的仓库(如Git @ ......)

git push <remote> <branch> 

要通过原点移动提交。 <branch>是你推动的分支(通常是“主人”)。

+0

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

+0

@gman你是对的,我删除了参考。 – iwein

3

在服务器上创建一个Git仓库(可以使用gitolite/Gitosis的,或只是一个普通用户帐号+ PUBKEY SSH AUTH),将服务器添加到使用

git remote add name url 

,并使用git push -u name master本地git仓库( -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 

后,每个本地资源库,网址是[email protected]:projectName

+0

它要求输入密码,所以我必须使用什么密码? – Fawwad

46

首先,你的服务器上创建一个混帐回购协议

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 :)“新创建的本地文件将被推送到远端,本地更新的文件将在远端强制更新,删除的文件将从远端删除结束。” – caligari

+0

这对我不起作用。远程回购得到各种'致命的:这个操作必须在工作树中运行'错误,如果我试图用它做任何事情 – gman

+0

这对我很好,我也添加了推送标签的行。注意:ssh://协议也可以是https://。 –

1

如果你有一个独立的本地工作树仓库(里面一个“git的”文件夹中的文件夹),您要添加一个遥控器:

  1. 创建的新的空库远程。
  2. 在本地存储库,设置新的远程为原点:

    cd localrepo

    git remote add origin REMOTEURL #(verify with git remote -v)

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

    git push --all --set-upstream origin #(verify with git branch -vv)

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

    git push --tags origin

在这一点上,本地存储库的行为就像从远程克隆的一样。


如果你有一个裸露的本地存储库(与git的结尾的名称的文件夹),你只是想复制到远程:

  1. 创建远程在一个新的空库。
  2. 在本地资源库,推动其所有分支机构的远程

    cd localrepo.git

    git push --all REMOTEURL

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

    git push --tags REMOTEURL

0

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

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

证明了新的回购协议是好的,用git状态/日志等,以让我感觉更好

举动不在版本控制下的任何文件从 - 上一页新localrepo

rm -rf localrepo.git localrepo-prev 
相关问题