我的机器上有一个git项目,我试图将其设置为直接(不涉及github,bitbucket等)推送到另一台机器上的仓库。我无法撤消该过程,只能从远程运行git clone
,因为我自己的计算机上没有sshd。
我已经将新遥控器告知了本地仓库:
git remote add deploy ssh://different.machine//path/to/repo/.git
但是如何设置新遥控器以接收更改?
如果我使用git init --bare
创建一个空遥控器,则可以推送所有更改,但是git checkout master
在远程计算机上失败,并显示消息“致命:此操作必须在工作中运行树”。
如果我使用git init
创建一个空遥控器,则命令git push --all deploy
将失败:
Enumerating objects: 51, done.
Counting objects: 100% (51/51), done.
Delta compression using up to 4 threads
Compressing objects: 100% (29/29), done.
Writing objects: 100% (51/51), 73.03 KiB | 73.03 MiB/s, done.
Total 51 (delta 21), reused 51 (delta 21)
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable t
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing int
remote: error: its current branch; however, this is not recommended unless ETC...
那么,推荐的方法是什么?我不想调整我不了解的“不推荐”设置,这会给我带来更多麻烦。
答案 0 :(得分:2)
如果我使用
git init --bare
创建一个空遥控器,则可以推送所有更改,但是git checkout master在远程计算机上失败,并显示消息fatal: This operation must be run in a work tree
。
让我们把它分解成小块,并解释为什么会一一进行。
git init --bare
当您运行git init <optional folder name>
时,git将创建一个新文件夹并使用.git
文件夹初始化该文件夹,而不会涉及太多细节,该文件夹包含“元数据” 让git运行,文件夹本身就是“ worktree”。
当您运行git init --bare
时,git不会创建.git
文件夹,而不是将内容包含在.git
文件夹中,而是该文件夹的内容位于当前文件夹中。这就是bare
的含义,您有一个没有工作树的裸仓库。
我可以推送所有更改
光秃秃的存储库包含您所有的分支,标签,注释等。“数据”与数据包的文件一起存储在“对象”文件夹中。
git checkout master
在远程计算机上失败,并显示消息fatal: This operation must be run in a work tree
。
如上所述,在布雷亚仓库中,您没有工作树,因此无法签出内容。
Git支持多种传输协议以在存储库之间进行连接。因此,您可以使用file
协议在远程计算机上创建一个有效的存储库。
# Clone the bare repo to a new folder
git clone /usr/folder/.../.git
另一种解决方案是使用git worktree
。
git worktrtee
将在您的裸仓库中创建工作树,以便您可以工作
###
### Creating new worktree
###
### create new branch inside the worktree folder
git worktree -b <branch name> <path>
# Or (branch name can be exiting branch or new one)
git worktree add <path>/<branch name>
答案 1 :(得分:1)
您忘了解释如何在其他计算机上使用存储库。
在没有更好地了解您的需求的情况下,通常建议的方法是使用中间的裸存储库和最终的非裸存储库。中间的裸存储库在哪里都没关系-git托管还是另一台计算机上的裸存储库。
您将推送到中间裸存储库,然后从中克隆/拉取到非裸存储库。您可以通过在裸仓库中添加一个post-receive
/ post-update
钩子来自动化该过程。
让我们在单个远程主机上创建两个存储库:
ssh user@remote-host "
cd /some/path/ &&
git init --bare myrepo.git &&
git clone myrepo.git myrepo &&
echo '#!/bin/sh
for ref in "$@"; do
if [ "$ref" = refs/heads/master ]; then
unset GIT_DIR
cd ../myrepo &&
exec git pull ../myrepo.git master
fi
done' > myrepo.git/hooks/post-update &&
chmod a+x myrepo.git/hooks/post-update
"
cd /path/to/local-repo &&
git remote add remote-repo user@remote-repo:/some/path/myrepo.git
git push remote-repo master