1001

昨天,我发布了一个关于如何将Git存储库从我的一台机器克隆到另一台机器的问题,如何从另一台机器“git clone”?.

我现在能够成功地将 Git 存储库从源 (192.168.1.2) 克隆到目标 (192.168.1.1)。

但是当我对文件 agit commit -a -m "test"和 a进行编辑时git push,我在目的地 (192.168.1.1) 上收到此错误:

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

我使用了两个不同版本的 Git(远程 1.7 和本地机器 1.5)。这是一个可能的原因吗?

4

31 回答 31

1186

错误消息error: refusing to update checked out branch: refs/heads/master由远程存储库发出,这意味着您正在尝试将代码推送到当前在工作目录中签出不同代码的远程非裸存储库。避免此问题的最佳方法是仅推送到裸存储库 - 裸存储库永远不会发生此问题。

您可以简单地将远程存储库转换为裸存储库(裸存储库中没有工作副本 - 该文件夹仅包含实际的存储库数据)。

在远程存储库文件夹中执行以下命令:

git config --bool core.bare true

然后删除除.git该文件夹中的所有文件。然后您将能够在git push没有任何错误的情况下执行远程存储库。

于 2010-07-14T22:45:21.807 回答
741

我刚开始学习Git时遇到了同样的错误。其他一些答案显然不适合 Git 新手!

我将使用非技术术语来传达这个想法。无论如何,发生的事情是您有两个存储库,一个是您第一次制作的原始文件,另一个是您刚刚制作的作品。

现在,您在工作存储库中并正在使用该master分支。但是您也恰好在原始存储库中“登录”到同一master分支。现在,由于您已经“登录”了原版,Git 担心您可能会搞砸,因为您可能正在处理原版并搞砸了。因此,您需要返回原始存储库并执行git checkout someotherbranch,现在您可以毫无问题地推送。

于 2010-05-29T03:26:25.603 回答
132

错误消息描述了发生的事情。如果分支被签出,更现代的 Git 版本拒绝通过推送更新分支。

在两个非裸存储库之间工作的最简单方法是

  1. 始终通过拉取(或获取并合并)来更新存储库,或者,如果必须,

  2. 通过推送到一个单独的分支(一个导入分支),然后将该分支合并到远程机器上的主分支中。

这个限制的原因是推送操作只在远程 Git 存储库上运行,它无权访问索引和工作树。因此,如果允许,对已签出分支的推送将更改为 HEAD 与远程存储库上的索引和工作树不一致。

这将很容易意外提交撤消所有已推送更改的更改,并且也很难区分尚未提交的任何本地更改以及已提交的新HEAD的、索引和工作树之间的差异。由推动引起HEAD

于 2010-05-12T06:21:14.573 回答
126

概括

您不能推送到存储库的已签出分支,因为它会以一种很可能以丢失数据和历史记录的方式与该存储库的用户混淆。但是您可以推送到同一存储库的任何其他分支。

由于裸存储库从未检出任何分支,因此您始终可以推送到裸存储库的任何分支。

有多种解决方案,具体取决于您的需求。

解决方案 1:使用裸存储库

如建议的那样,如果在一台机器上不需要工作目录,则可以移动到裸存储库。为避免弄乱存储库,您可以克隆它:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

现在您可以将所有想要的东西推送到与以前相同的地址。

解决方案 2:推送到未签出的分支

但是如果你需要在你的遥控器上查看代码<remote>,那么你可以使用一个特殊的分支来推送。假设在您的本地存储库中,您已经调用了远程origin,并且您在分支 master 上。然后你可以做

machine2$ git push origin master:master+machine2

然后你需要在origin远程仓库中合并它:

machine1$ git merge master+machine2

问题的尸检

当一个分支被签出时,提交将添加一个以当前分支的头部作为其父分支的新提交,并将分支的头部移动到该新提交。

所以

A ← B
    ↑
[HEAD,branch1]

变成

A ← B ← C
        ↑
    [HEAD,branch1]

但是如果有人可以在中间推送到那个分支,用户就会进入 git 所说的分离头模式:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

现在用户不再在 branch1 中,没有明确要求签出另一个分支。更糟糕的是,用户现在在任何分支之外,任何新的提交都只是悬空

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

假设,如果此时用户签出另一个分支,那么这个悬空提交对于 Git 的垃圾收集器来说是公平的游戏。

于 2013-02-14T16:28:01.017 回答
68

.git/config您可以通过在目标服务器上编辑来绕过这个“限制” 。添加以下内容以允许将 git 存储库推送到即使它已“签出”:

[receive]
denyCurrentBranch = warn

或者

[receive]
denyCurrentBranch = false

第一个将允许推送,同时警告可能会弄乱分支,而第二个将只是悄悄地允许它。

这可用于将代码“部署”到不用于编辑的服务器。这不是最好的方法,而是一种快速部署代码的方法。

于 2010-12-16T05:17:16.747 回答
53

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

在服务器存储库上使用它,如果不会发生未跟踪的覆盖,它还会更新工作树。

正如VonC在评论中提到的,它是在Git 2.3中添加的。

我已经编译了 Git 2.3 并试了一下。示例用法:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

输出:

a
b

耶,b被推了!

于 2015-02-07T14:57:34.263 回答
44

我喜欢在远程机器上仍然有一个可用存储库的想法,但我喜欢使用以下方法而不是虚拟分支:

git checkout --detach

这似乎是Git的一个非常新的特性——我使用的是 git 版本 1.7.7.4。

于 2012-02-14T20:37:50.877 回答
30

我遇到过同样的问题。对我来说,我使用 Git push 将代码移动到我的服务器。我从不更改服务器端的代码,所以这是安全的。

在存储库中,您正在推动键入:

git config receive.denyCurrentBranch ignore

这将允许您在存储库是工作副本时更改它。

运行 Git 推送后,转到远程计算机并输入以下内容:

git checkout -f

这将使您推送的更改反映在远程机器的工作副本中。

请注意,如果您在推送到的工作副本中进行更改,这并不总是安全的。

于 2011-01-27T00:42:27.197 回答
25

您可以重新创建服务器存储库并从本地分支主服务器推送到服务器主服务器。

在您的远程服务器上:

mkdir myrepo.git
cd myrepo.git
git init --bare

好的,从您当地的分支机构:

git push origin master:master
于 2011-02-07T08:22:48.067 回答
25

你可能做了什么导致这个:

当你去敲出一个小程序时,就会发生这种事情。你即将改变一些已经在起作用的东西,所以你施展了你的 3 级永久不可撤销咒语:

machine1:~/proj1> git init

然后你开始添加/提交。但是随后,该项目开始参与更多,并且您想从另一台计算机(例如您的家用 PC 或笔记本电脑)上处理它,因此您可以执行以下操作

machine2:~> git clone ssh://machine1/~/proj1

它克隆了,一切看起来都很好,所以你从 machine2 处理你的代码。

然后......您尝试从 machine2 推送您的提交,并在标题中收到警告消息。

此消息的原因是因为您从中提取的 git 存储库有点打算仅用于 machine1 上的该文件夹。你可以从中克隆就好了,但推送可能会导致问题。在两个不同位置管理代码的“正确”方法是使用“裸”存储库,就像建议的那样。一个裸仓库并不是为了在其中完成任何工作而设计的它旨在协调来自多个来源的提交。这就是为什么最受好评的答案建议在您之后删除.git 文件夹以外的所有文件/文件夹git config --bool core.bare true

澄清评价最高的答案:对该答案的许多评论都说“我没有从 machine1 中删除非 .git 文件,我仍然能够从 machine2 提交”。这是正确的。但是,这些其他文件现在完全从 git repo 中“分离”了。进去试试git status,你应该会看到类似“致命:此操作必须在工作树中运行”的内容。因此,删除文件的建议并不是为了让 machine2 的提交生效;这样您就不会感到困惑并认为 git 仍在跟踪这些文件。但是,如果您仍想处理 machine1 上的文件,删除文件是个问题,不是吗?

那么,你真的应该怎么做?

取决于您计划在 machine1 和 machine2 上工作多少...

如果您已完成从 machine1 的开发并将所有开发移至 machine2...只需按照最受好评的答案建议:git config --bool core.bare true然后,可选择从该文件夹中删除除 .git 之外的所有文件/文件夹,因为它们'未跟踪并可能引起混乱。

如果您在 machine2 上的工作只是一次性的事情,并且您不需要在那里继续开发......那么不要费心制作一个裸回购;只是 ftp/rsync/scp/等。您的文件从机器*2* 放在机器*1* 上的文件之上,从机器*1* 提交/推送,然后从机器*2* 中删除文件。其他人建议创建一个分支,但我认为如果您只想合并您在另一台机器上一次性完成的一些开发,这有点混乱。

如果您需要在 machine1 和 machine2 上继续开发......那么您需要正确设置。您需要将您的 repo 转换为裸机,然后您需要在 machine1 上克隆它以供您使用可能最快的方法是这样做

machine1:~/proj1> git config --bool core.bare true
machine1:~/proj1> mv .git/ ../proj1.git
machine1:~/proj1> cd ..
machine1:~> rm -rf proj1
machine1:~> git clone proj1.git
machine1:~> cd proj1

非常重要:因为您已将 repo 的位置从 proj1 移动到 proj1.git,所以您需要在 machine2 上的 .git/config 文件中更新它。之后,您可以从 machine2 提交您的更改。最后,我尝试将我的裸存储库放在远离我的工作树的中央位置(即不要将'proj1.git' 放在与'proj1' 相同的父文件夹中)。我建议你也这样做,但我想让上述步骤尽可能简单。

于 2016-05-12T21:07:51.297 回答
18

通过几个设置步骤,您可以使用单线轻松将更改部署到您的网站,例如

git push production

这既好又简单,您不必登录远程服务器并进行拉取或任何操作。请注意,如果您不将生产结帐用作工作分支,这将最有效!(OP 在稍微不同的环境中工作,我认为@Robert Gould 的解决方案很好地解决了这个问题。这个解决方案更适合部署到远程服务器。)

首先,您需要在您的服务器上的某个位置(在您的 webroot 之外)设置一个裸存储库。

mkdir mywebsite.git
cd mywebsite.git
git init --bare

然后创建文件hooks/post-receive

#!/bin/sh
GIT_WORK_TREE=/path/to/webroot/of/mywebsite git checkout -f

并使文件可执行:

chmod +x hooks/post-receive

在您的本地机器上,

git remote add production git@myserver.com:mywebsite.git
git push production +master:refs/heads/master

可以了,好了!现在,将来您可以使用它git push production来部署您的更改!

此解决方案的功劳归于http://sebduggan.com/blog/deploy-your-website-changes-using-git/。在此处查找有关正在发生的事情的更详细说明。

于 2012-10-15T18:16:00.607 回答
13

您应该只推送到裸存储库。裸仓库是没有签出分支的仓库。如果您要 cd 到一个裸存储库目录,您只会看到 .git 目录的内容。

于 2010-05-12T06:09:09.490 回答
12

检查您.git/config的目标项目:

$ cat .git/config 
[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[receive]
    denyCurrentBranch = updateInstead

如果core. bare为假,您可以将其设置为真:

$ git config core.bare true

然后在本地推送到远程:

git push remote_repo   // suppose the destination repo is remote_repo

它会成功,在 remote_repo 你可以检查 git 版本。

$ git log -1
commit 0623b1b900ef7331b9184722a5381bbdd2d935ba
Author: aircraft < aircraft_xxx@126.com>
Date:   Thu May 17 21:54:37 2018 +0800

现在你不能在你的“工作区”中使用 git:

$ git status
fatal: This operation must be run in a work tree

你应该设置bare.bare回false。

$ git config core.bare false
于 2018-05-18T02:54:48.723 回答
10

你有3个选项

  1. 再拉再推:

    git pull; git push
    
  2. 推入不同的分支:

    git push origin master:foo
    

    并将其合并到远程(通过gitpull-request

    git merge foo
    
  3. 强制它(不推荐,除非您故意通过 更改提交rebase):

    git push origin master -f
    

    denyCurrentBranch 如果仍然被拒绝,请在远程存储库上禁用:

    git config receive.denyCurrentBranch ignore
    
于 2015-09-30T15:40:12.283 回答
7

事实上,将远程设置为非签出分支就足够了。在不同的分支中签出遥控器后,您可以推送。

于 2010-12-11T15:03:42.097 回答
5

旧版本的 Git 曾经允许推送到非裸存储库的当前签出分支。

事实证明,这是一件非常令人困惑的事情。所以他们添加了你看到的警告信息,这也非常令人困惑。

如果第一个存储库只是充当服务器,则按照其他答案的建议将其转换为裸存储库并完成。

但是,如果您需要在两个都在使用的存储库之间有一个共享分支,您可以通过以下设置实现它

Repo1 - 将充当服务器,也用于开发

Repo2 - 仅用于开发

如下设置 Repo1

创建一个分支来共享工作。

git branch shared_branch

为了安全起见,您还应该创建一个 $(REPO).git/hooks/update 来拒绝对除了 shared_branch 之外的任何内容的任何更改,因为您不希望人们对您的私有分支进行处理。

repo1/.git/hooks  (GIT_DIR!)$ cat update
#!/bin/sh
refname="$1"
oldrev="$2"
newrev="$3"

if [ "${refname}" != "refs/heads/shared_branch" ]
then
   echo "You can only push changes to shared_branch, you cannot push to ${refname}"
   exit 1
fi

现在在 repo1 中创建一个本地分支,您将在其中进行实际工作。

git checkout -b my_work --track shared_branch
Branch my_work set up to track local branch shared_branch.
Switched to a new branch 'my_work'

(可能需要git config --global push.default upstream为了git push工作)

现在您可以使用

git clone path/to/repo1 repo2 
git checkout shared_branch 

此时,您已将 repo1 和 repo2 设置为在从shared_branchrepo1 推送和拉取的本地分支上工作,而无需担心该错误消息或使工作目录在 repo1 中不同步。无论您使用什么正常的工作流程都应该有效。

于 2014-10-27T21:28:21.100 回答
5

我在使用 Git 同步 Android 手机和笔记本电脑上的存储库时遇到了同样的问题。正如@CharlesBailey 建议的那样,我的解决方案是拉而不是推。

git push origin master对我来说,Android 存储库上的错误消息与@hap497 一样,因为推送到存储库+工作副本的非裸签出。

git pull droid master在笔记本电脑存储库和工作副本上对我有用。当然,您需要之前运行过类似git remote add droid /media/KINGSTON4GB/notes_repo/.

于 2012-04-15T04:29:24.683 回答
3

OK, in case you want a normal remote repository, then create an extra branch and check it out. Push it into one branch (which is not checked out) and merge it with one which is currently active later after pushing from locally.

For example, on a remote server:

git branch dev
git checkout dev

On the local setup:

git push 

On remote server:

git merge dev
于 2013-01-31T15:28:52.233 回答
2

这是您可以进行的一项测试,以了解bare服务器的工作原理:

想象一下,你有一个工作站和一个服务器,上面托管着实时站点,并且你想不时更新这个站点(这也适用于两个开发人员通过一个裸中间人来回发送他们的工作的情况)。

初始化

在本地计算机上创建一些目录并cd进入其中,然后执行以下命令:

# initialization
git init --bare server/.git
git clone server content
git clone server local
  1. 首先,您创建一个裸server目录(注意末尾的 .git)。此目录将仅用作存储库文件的容器。
  2. 然后将您的服务器存储库克隆到新创建的content目录。这是您的实时/生产目录,将由您的服务器软件提供服务。
  3. 前两个目录位于您的服务器上,第三个是您工作站上的本地目录。

工作流程

现在这是基本的工作流程:

  1. 进入local目录,创建一些文件并提交它们。最后将它们推送到服务器:

    # create crazy stuff
    git commit -av
    git push origin master
    
  2. 现在进入content目录并更新服务器的内容:

    git pull
    
  3. 重复 1-2。这里content可能还有另一个开发人员也可以推送到服务器,local你可以从他那里拉取。

于 2012-07-18T12:59:24.370 回答
2

使用它将其推送到远程上游分支为我解决了这个问题:

git push <remote> master:origin/master

遥控器无法访问上游存储库,因此这是获取该遥控器最新更改的好方法

于 2018-10-05T15:48:37.667 回答
1

我相信大多数查看这个问题的人都会停留在前两个重要的答案上,但我仍然想提供我的解决方案。

遇到所描述的错误时,我有一个 Eclipse + EGit Web 项目设置。帮助我的是简单地使用 GitHub 应用程序,它似乎神奇地解决了这个问题。虽然 EGit 总是拒绝推送,但 GitHub 桌面应用程序只会耸耸肩并推送我的更改。也许它可以更优雅地处理多登录情况。

于 2013-05-06T20:33:50.487 回答
1

我刚刚在Heroku上部署 git 存储库时遇到了这个问题。

我不知道为什么 Heroku 有一个非裸存储库,但作为一种解决方法,我能够重置远程存储库并重新上传。

您不应该使用 Heroku 的存储库副本作为您唯一的 git 存储库进行协作,但以防万一,我会明确说明:除非您确定您的存储库的完整副本安全地存储在其他地方,否则不要这样做赫罗库。执行重置将删除存储库内容。

重置:

  1. 如果您还没有安装Heroku 工具带(其中包含命令行客户端)。
  2. 如果你还没有安装heroku-repo 插件。

    heroku plugins:install https://github.com/heroku/heroku-repo.git
    
  3. 执行重置,这会删除存储库并创建一个新的空存储库

    heroku repo:reset
    
  4. 像往常一样推送到您的 Heroku 遥控器;它会重新上传所有内容。

于 2014-09-11T19:24:25.967 回答
1

最好的方法是:

mkdir ..../remote
cd ..../remote
git clone --bare .../currentrepo/

这将克隆存储库,但不会在.../remote. 如果您查看遥控器,您会看到创建了一个名为 的目录currentrepo.git,这可能就是您想要的。

然后从本地 Git 存储库:

git remote add remoterepo ..../remote/currentrepo.git

进行更改后,您可以:

git push remoterepo master
于 2012-09-02T23:55:52.040 回答
1

我发现一篇可能对其他人有用的文章是Git in 5 minutes

我有一个受 Git 版本控制的Xcode项目,我想将它推送到我在 DC 中的虚拟分布式以太网(VDE)。VDE 运行Centos 5。

我读过的关于 Git 的文章都没有谈到裸仓库。这一切听起来都很简单,直到我尝试了我认为应该很容易来自SVN背景的东西。

此处使远程存储库裸露的建议有效。对我的要求更好的是将 Xcode 项目克隆到projectname.git,然后将其复制到远程服务器;然后推动神奇地工作。下一步将让 Xcode 推送而不会出现关于提交的错误,但现在我可以从终端执行此操作。

所以:

cd /tmp (or another other directory on your system)<br/>
git clone --bare /xcode-project-directory projectname.git<br/>
scp -r projectname.git sshusername@remotehost.com:repos/<br/>

在 Xcode 中提交后从 Xcode 项目推送更改:

cd /xcode-project-directory<br/>
git push sshusername@remotehost.com:repos/projectname.git<br/>

我敢肯定有一种更流畅更复杂的方式来完成上述操作,但至少这是可行的。一切都清楚了,这里有一些澄清: /xcode-project-directory是您的 xcode 项目存储的目录。它可能是/Users/Your_Name/Documents/Project_Name. projectname 字面意思是项目的名称,但它可以是任何您喜欢的名称。Git 不在乎,你会的。

要使用 scp,您需要在允许SSH访问的远程服务器上拥有一个用户帐户。任何运行自己的服务器的人都会有这个。如果您使用的是共享主机等,您可能会不走运。

remotehost.com是您的远程主机的名称。您可以轻松地使用其 IP 地址。为了更清楚起见,我在远程主机上使用 SSH 密钥使用Gitosis,所以当我推送时不会提示我输入密码。托管 Git 存储库,简单(且安全)的方式一文告诉您如何设置所有这些。

于 2012-03-16T12:18:07.267 回答
1

git --init我不得不在现有的裸存储库中重新运行,这.git在裸存储库树中创建了一个目录——我在那儿输入后意识到这一点git status。我删除了它,一切又好了:)

(所有这些答案都很棒,但就我而言,这是完全不同的(据我所知),如所述。)

于 2012-09-06T19:09:06.173 回答
1

创建空(裸)存储库后,您将需要更改远程服务器上的配置文件,例如

root@development:/home/git/repository/my-project# cat config 

在那里你会看到

[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true

您将把它从假到真,我删除了 logallrefupdates = true (不确定它的用途!)

[core]
repositoryformatversion = 0
filemode = true
bare = true

您可以测试以下

$ git remote show origin
* remote origin
Fetch URL: my-portal@development:/home/XYZ/repository/XYZ
Push  URL: my-portal@development:/home/XYZ/repository/XYZ
HEAD branch: (unknown)

如果您无法 PUSH,将显示此 HEAD 分支:(未知)。所以如果 HEAD 分支是未知的,你应该将 bare 更改为 true 并且推送成功后你可以重用

git remote show origin

你会看到

 HEAD branch: master
于 2015-09-11T13:18:04.110 回答
0

对我来说,工作解决方案是:

远程:

git checkout -b some_tmp_name

在本地:

git push

远程:

git checkout master
git branch -d some_tmp_name

但这不是真正的解决方案,它只是解决方法。

于 2014-06-28T14:10:50.650 回答
0

以防万一有人觉得它有用。对我来说,这是一个 git 服务器权限问题。我从一开始就检查了项目并推送了一个简单的文件,然后我得到了“推送被拒绝:推送到源/主服务器被拒绝”

于 2015-06-19T06:27:22.943 回答
-1

使用 Git,两个常规(非裸)存储库无法直接来回推送/拉取文件。必须有一个中间裸存储库。显然,这有点像一对有孩子的已婚夫妇,而这对夫妇正在离婚。父母不会互相交谈,但他们会通过孩子交流。

所以,你有一个存储库,你将这个存储库克隆到一个裸存储库,然后将它克隆到第三个。第一个和第三个可以通过第二个存储库(裸存储库)交换信息。我想这是有道理的,因为您不希望有人能够在未经您同意的情况下将内容签入您的存储库,因为这可能会导致合并冲突等。

所以,这里有一个例子:

在 PC 上,在 ~/workspace 中

git init
echo "line 1" > afile.txt
git add .
git commit -m ‘initial import’
git clone --bare . ../remote-repository.git
git remote add origin ../remote-repository.git
git push --set-upstream origin master

在笔记本电脑上,在 ~/workspace 中(不要执行 git init 等)

git clone //LJZ-DELLPC/remote-repository.git/ .

// 然后进行各种提交,并推送它们:

echo "line 2" > afile.txt
git add afile.txt
git commit -m 'added line 2'
git push    

然后回到 PC 上,在 ~/workspace

git pull

// 然后进行各种提交,并推送它们:

git push

在笔记本电脑上 git pull

等等..

这是一台机器上的一个绝对具体的例子,直接从命令窗口复制,这样我们就知道没有遗漏任何步骤,它确实有效,等等:

lylez@LJZ-DELLPC ~
$ cd gitdir
/home/lylez/gitdir

lylez@LJZ-DELLPC ~/gitdir
$ ls

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1
/home/lylez/gitdir/repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git init
Initialized empty Git repository in /home/lylez/gitdir/repo1/.git/

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 1" > afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'initial import'
[master (root-commit) f407e12] initial import
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git clone --bar . ../repo1-bare-clone
Cloning into bare repository '../repo1-bare-clone'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git remote add origin ../repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push --set-upstream origin master
Branch master set up to track remote branch master from origin.
Everything up-to-date

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ..

lylez@LJZ-DELLPC ~/gitdir
$ ls
repo1  repo1-bare-clone

lylez@LJZ-DELLPC ~/gitdir
$ mkdir repo1-remote

lylez@LJZ-DELLPC ~/gitdir
$ cd repo1-remote
/home/lylez/gitdir/repo1-remote

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git clone ../repo1-bare-clone .
Cloning into '.'...
done.

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ echo "line 2" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git commit -m 'added line 2'
[master 5ad31e0] added line 2
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 260 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   f407e12..5ad31e0  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cd ../repo1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From ../repo1-bare-clone
   f407e12..5ad31e0  master     -> origin/master
Updating f407e12..5ad31e0
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1
$ echo "line 3" >> afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git add afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git commit -m 'added line 3'
[master 3fa569e] added line 3
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1
$ git push
Counting objects: 3, done.
Writing objects: 100% (3/3), 265 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To ../repo1-bare-clone
   5ad31e0..3fa569e  master -> master

lylez@LJZ-DELLPC ~/gitdir/repo1
$ cd ../repo1-remote/

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ ls
afile.txt

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git pull
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From /home/lylez/gitdir/repo1-remote/../repo1-bare-clone
   5ad31e0..3fa569e  master     -> origin/master
Updating 5ad31e0..3fa569e
Fast-forward
 afile.txt | 1 +
 1 file changed, 1 insertion(+)

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ cat afile.txt
line 1
line 2
line 3

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
$ git --version
git version 2.1.1

lylez@LJZ-DELLPC ~/gitdir/repo1-remote
于 2014-10-18T20:43:17.700 回答
-1

当我在我的 NAS 上克隆一个 repo 然后将该 repo 克隆到我的机器上时,我遇到了这个问题。

设置是这样的:

原始(github):

  • 克隆到我的私人家庭网络(我的家庭网络)中的网络存储
    • 分支签出:DEVELOPMENT
  • 克隆到其他机器(笔记本电脑、我办公室的小型数据中心服务器等)
    • 分支签出:DEVELOPMENT

当我尝试从笔记本电脑提交到 NAS 服务器时,出现的错误是

! [remote rejected]   development -> development (branch is currently checked out)

根本原因是DEVELOPMENT分支在 NAS 服务器上被签出。我的解决方案是在 NAS 存储库上切换到任何其他分支。这让我可以提交我的更改。

于 2021-02-02T18:26:59.343 回答
-3

我的解决方案(使用中)

  1. 在远程服务器上签出“master”
  2. 在“dev”分支上本地工作
  3. 将更改推送到远程开发
  4. 在远程将 dev 合并到 master

答对了

于 2013-09-15T00:09:00.247 回答