Git推错误'[远程拒绝]主 - > master(分支目前正在检出)'

时间:2010-05-12 06:06:36

标签: git git-push

昨天,我发布了一个关于如何将Git存储库从我的某台计算机克隆到另一台计算机的问题, How can I 'git clone' from another machine?

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

但是当我对文件,git commit -a -m "test"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)。这是一个可能的原因吗?

31 个答案:

答案 0 :(得分:1106)

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

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

git config --bool core.bare true

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

答案 1 :(得分:677)

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

(我将使用非技术术语来实现这个想法。)无论如何,发生的事情是你有两个存储库,一个是你最初创建的原始版本,另一个是你刚刚创建的工作。 / p>

现在您在工作存储库中并使用“主”分支。但是,您也恰好在原始存储库中“登录”到同一个“主”分支。既然你已经在原版中“登录”了,Git担心你可能会陷入困境,因为你可能正在研究原版并搞砸了。因此,您需要返回原始存储库并执行“git checkout someotherbranch”,现在您可以毫无问题地推送。

我希望这会有所帮助。

答案 2 :(得分:123)

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

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

  1. 始终通过pull(或fetch and merge)更新存储库,或者,如果必须,

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

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

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

答案 3 :(得分:111)

摘要

您无法推送到存储库的一个已检出分支,因为它会以最有可能以数据丢失和历史记录结束的方式混淆该存储库的用户。但是你可以推送到同一个存储库的任何其他分支。

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

根据您的需要,有多种解决方案。

解决方案1:使用Bare Repostiory

根据建议,如果在一台计算机上,您不需要工作目录,则可以移至裸存储库。为避免弄乱存储库,您只需克隆它:

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

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

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

但是如果您需要查看远程<remote>上的代码,那么您可以使用特殊分支进行推送。假设您在本地存储库中调用了远程origin并且您在分支主服务器上。然后你可以做

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的垃圾收集器的公平游戏。

答案 4 :(得分:60)

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

[receive]
denyCurrentBranch = warn

[receive]
denyCurrentBranch = false

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

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

答案 5 :(得分:40)

我喜欢在远程盒子上仍然有一个可用的存储库的想法,但我喜欢使用:

而不是虚拟分支。
git checkout --detach

这似乎是Git的一个非常新的功能 - 我使用的是git版本1.7.7.4。

答案 6 :(得分:38)

<强> git config --local receive.denyCurrentBranch updateInstead

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

在服务器存储库中使用它,如果没有未经跟踪的覆盖,它也会更新工作树。

评论中将Git 2.3添加为mentioned by VonC

我编译了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被推了!

答案 7 :(得分:28)

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

在存储库中,您要输入:

git config receive.denyCurrentBranch ignore

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

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

git checkout -f

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

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

答案 8 :(得分:24)

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

在远程服务器上:

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

好的,来自您当地的分支机构:

git push origin master:master

答案 9 :(得分:20)

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

当你去敲打一个小程序时会发生这种事情。你即将改变已经有效的东西,所以你施展了你永久无法解决的3级法术:

machine1:~/proj1> git init

然后开始添加/提交。但是然后,项目开始变得更加复杂,你想从另一台计算机(如你的家用电脑或笔记本电脑)处理它,所以你做了类似的事情

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

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

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

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

澄清评分最高的回答:对该答案的许多评论都说“我没有删除机器1中的非.git文件,而我仍然可以从机2" 。那就对了。但是,那些其他文件现在完全与git repo“脱离”了。在那里试试git status你应该看到类似“致命的东西:这个操作必须在工作树中运行”。因此,删除文件的建议不是因为machine2的提交将工作;这样你就不会感到困惑,并认为git仍在跟踪这些文件。但是,如果您仍想处理machine1上的文件,删除文件是一个问题,不是吗?

那么,你应该做什么?

取决于你打算在machine1和machine2上工作多少......

如果你已经完成了从machine1的开发并将所有开发工作都移到了machine2 ...... ,那么只需按照评分最高的答案建议:git config --bool core.bare true然后,可选地,从该文件夹中删除.git以外的所有文件/文件夹,因为它们未被跟踪并且可能导致混淆。

如果您在machine2上的工作只是一次性的事情,并且您不需要继续在那里继续开发...... 那么就不要费心去做一个简单的回购;只需ftp / rsync / scp / etc.您的文件来自机器* 2 *在机器上的文件* 1 *,从机器* 1 *提交/推送,然后从机器* 2 *删除文件。其他人建议创建一个分支,但我认为如果你只想将你在一次性基础上进行的一些开发合并到另一台机器上,那就太麻烦了。

如果您需要在machine1和machine2上继续开发...... ,那么您需要正确设置。您需要将您的仓库转换为裸仓,然后您需要在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'相同的父文件夹中)。我建议你这样做,但我想让上面的步骤尽可能简单。

答案 10 :(得分: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/。在那里查看有关正在发生的事情的更详细说明。

答案 11 :(得分:10)

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

答案 12 :(得分:9)

您有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
    

答案 13 :(得分:7)

实际上,将远程设置为非签出分支就足够了。在另一个分支中检出您的遥控器后,您可以推送。

答案 14 :(得分:5)

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

Android存储库上的

git push origin master对我来说失败了,因为推送了非正常的存储库+工作副本的错误消息@ hap497。

笔记本电脑存储库上的

git pull droid master和工作副本对我有用。当然,您需要先运行类似git remote add droid /media/KINGSTON4GB/notes_repo/的内容。

答案 15 :(得分:4)

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

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

如果第一个存储库只是充当服务器,那么将其转换为裸存储库,因为其他答案建议并完成它。

但是,如果你需要在两个正在使用的repos之间有一个共享分支,你可以通过以下设置实现它

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工作)

现在您可以使用

创建repo2
git clone path/to/repo1 repo2 
git checkout shared_branch 

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

答案 16 :(得分:2)

检查目标项目中的.git/config

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

如果core. bare为false,则可以将其设置为true:

$ 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

答案 17 :(得分:2)

好的,如果你想要一个普通的远程存储库,那么创建一个额外的分支并检查它。将其推入一个分支(未检出)并将其与从本地推送后当前处于活动状态的分支合并。

例如,在远程服务器上:

git branch dev
git checkout dev

在本地设置上:

git push 

在远程服务器上:

git merge dev

答案 18 :(得分:2)

您可以通过以下一项测试来了解bare服务器的工作原理:

想象一下,你有一个工作站和一个托管有实时网站的服务器,你想不时更新这个网站(这也适用于两个开发人员来回传递他们的工作的情况一个光秃秃的中间人。)

初始化

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

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

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

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

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

      git pull
      
    3. 重复1-2。此处content可能是另一个可以推送到服务器的开发人员,而local可能会从他那里获取。

答案 19 :(得分:1)

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

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

你不应该使用Heroku的存储库副本作为你唯一的git协作存储库,但为了以防万一,我会清楚地说:除非你确定你有完整的副本,否则不要这样做存储库安全地存储在除Heroku之外的某个地方。执行重置将删除存储库内容。

要重置:

  1. 安装Heroku toolbelt(包含命令行客户端)(如果尚未安装)。
  2. 如果您还没有安装heroku-repo plugin

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

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

答案 20 :(得分:1)

我相信大多数观看此问题的人都会停在前两个答案中,但我仍然愿意提供我的解决方案。

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

答案 21 :(得分:1)

我必须在现有的裸存储库中重新运行git --init,这在裸存储库树中创建了一个.git目录 - 我意识到在那里输入git status之后。我删除了,一切都很好了:))

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

答案 22 :(得分: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)

如果您无法推动,将显示此HEAD分支:(未知)。因此,如果HEAD分支未知,则应将bare更改为true,并且在推送成功后,您可以重用

git remote show origin

你会看到

 HEAD branch: master

答案 23 :(得分:1)

最好的方法是:

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

这将克隆存储库,但它不会在.../remote中创建任何工作副本。如果你看一下遥控器,你会看到一个名为currentrepo.git的目录,这可能是你想要的。

然后从您当地的Git存储库:

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

进行更改后,您可以:

git push remoterepo master

答案 24 :(得分:1)

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

我在Git版本控制下有一个Xcode项目,我希望将其推送到DC中的Virtual Distributed Ethernet(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,所以当我推送时我不会被提示输入密码。文章 Hosting Git Repositories, the Easy (and Secure) Way 告诉您如何设置所有内容。

答案 25 :(得分:1)

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

git push <remote> master:origin/master

远程无法访问上游仓库,所以这是将最新更改添加到该远程的好方法

答案 26 :(得分:0)

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

ON REMOTE:

git checkout -b some_tmp_name

ON LOCAL:

git push

ON REMOTE:

git checkout master
git branch -d some_tmp_name

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

答案 27 :(得分:0)

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

答案 28 :(得分:-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

答案 29 :(得分:-1)

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

设置是这样的:

原文(github):

  • 克隆到我的私人家庭网络(我的家庭网络)中的网络存储
    • 分支签出:\documentclass{article} \usepackage{amsmath,eqparbox} %\usepackage{xparse}% If you have LaTeX2e < 2020-10-01 % https://tex.stackexchange.com/a/34412/5764 \makeatletter % \eqmathbox[<tag>][<align>]{<math>} \NewDocumentCommand{\eqmathbox}{o O{c} m}{% \IfValueTF{#1} {\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}} {\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}} \mathpalette\eqmathbox@{#3} } \makeatother \begin{document} \[ \renewcommand{\arraystretch}{1.2} \setlength{\arraycolsep}{0pt} \begin{array}{ r c r c r c r } 2 x_1 & {}-{} & x_2 & {}+{} & 1.5 x_3 & {}={} & 8 \\ x_1 & & & {}-{} & 4 x_3 & {}={} & -7 \end{array} \] \begin{alignat*}{4} 2 x_1 & {}-{} & x_2 & {}+{} & 1.5 x_3 = {} && 8 \\ x_1 & & & {}-{} & 4 x_3 = {} && -7 \end{alignat*} \begin{align*} \eqmathbox[x1][r]{2 x_1} - \eqmathbox[x2][r]{x_2} + \eqmathbox[x3][r]{1.5 x_3} &= \eqmathbox[c][r]{8} \\ \eqmathbox[x1][r]{ x_1} \phantom{{}-{}} \eqmathbox[x2][r]{} - \eqmathbox[x3][r]{4 x_3} &= \eqmathbox[c][r]{-7} \end{align*} \end{document}
  • 克隆到其他机器(笔记本电脑、我办公室的小型数据中心服务器等)
    • 分支签出:DEVELOPMENT

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

DEVELOPMENT

根本原因是 ! [remote rejected] development -> development (branch is currently checked out) 分支在 NAS 服务器上被检出。我的解决方案是在 NAS 存储库上切换到任何其他分支。这让我可以提交我的更改。

答案 30 :(得分:-3)

我的解决方案(正在使用中)

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