问题描述
如果我的directory1包含文件的选择并且在git的控制下,则我运行..
git clone -l $HOME/directory1 directory2
我现在在我的cwd中有一个directory1的副本。
如果我然后在directory2中编辑文件,将其添加到暂存并提交,则在收到错误消息后无法将其推送到directory1。
remote: error: refusing to update checked out branch: refs/heads/master
我不明白这一点,因为远程分支(目录1)是最新的,并且在将其克隆到目录2和尝试将其推回到目录1之间,我没有进行更改。
编辑:如果我在directory2内运行git status
,则会显示“您的分支在1次提交之前领先于原始服务器/主服务器”。
我还是不明白。
解决方法
您看到的错误是因为directory1
中的存储库包含一个工作副本,其中master
是当前已签出的分支。
此时,您有两种选择:
- 将
directory1
中的存储库转换为bare repository(即没有工作副本的存储库) - 通过将
receive.denyCurrentBranch
选项设置为directory1
从directory2
推送时,告诉Git更新updateInstead
中的工作副本:cd directory1 git config receive.denyCurrentBranch updateInstead
您可以在documentation中了解有关此选项的更多信息:
如果设置为
true
或refuse
,则git-receive-pack
将拒绝对非裸存储库的当前签出分支的引用更新。这样的推送具有潜在的危险,因为它会使HEAD与索引和工作树不同步。
refuse
是默认值,因此当您按下时会出错。关于updateInstead
值:
另一个选项是
updateInstead
,如果压入当前分支,它将更新工作树。
如果您的目标是使directory1
和directory2
保持同步,那么我认为这是更可取的选择。但是,请记住:
默认情况下,如果工作树或索引与HEAD有任何不同,
updateInstead
将拒绝推送。
这意味着,如果您对directory1
进行了未提交的更改,则从directory2
进行的推送将失败,因为它将覆盖索引和工作副本中的所有内容。