我有自己的GIT服务器,我在其中做了一个公共repo的"裸克隆"。让我们称PUB为公共repo,LOC为我自己服务器上的裸克隆。我使用LOC作为远程开发,创建PUB中没有的我自己的分支。然后我将我的分支推送到LOC。
我想从PUB到LOC获取任何新内容,但我不想自己的任何分支从LOC推送到PUB。
我不能在PUB上做任何操作,因为它不在我的控制范围内。我可以在LOC上做任何操作。
为了达到我所描述的目的,我有一个每晚运行的脚本,它执行:
git --git-dir ${LOC_PATH} remote update --prune
如果我使用将PUB克隆到LOC
git clone --mirror <remote_repo>
然后在脚本执行时,我自己的分支从LOC中被擦除。
如果我使用将PUB克隆到LOC
git clone --bare <remote_repo>
那么脚本似乎成功地将PUB提取到LOC(这是命令输出所建议的);但是用浏览器观察LOC内容或将LOC提取到我的PC上时,我在日志中没有看到我知道存在于PUB中的任何新提交。
阅读其他stackoverflow问题的答案,似乎正确的命令是:
git --git-dir ${LOC_PATH} fetch --all
但目前我坚持使用git ... remote update ...
,因为它应该执行隐式fetch
操作。
有什么解决方案可以自动更新这种古怪的镜像形式吗?
我看了看:
- Mirror git repo into new branch
- How do you update a bare repo from a remote source using git
- How to keep all branches and tags in sync in a fork or mirror repo?
- How do I update my bare repo?
和一些其他网站上找到的互联网。显然我没有找到可行的解决方案。
1条答案
按热度按时间wfypjpf41#
我检查了我的机器与一些repos和得出以下结论:
git remote update
确实执行了隐式fetch
和...git fetch
也不能解决这个问题。在上述操作之后,
FETCH_HEAD
被创建并指向公共远程存储库(在问题中称为PUB)上的最新提交。由于本地存储库(称为LOC)是一个空存储库,因此不可能在其上执行merge
或pull
。当pull
从LOC发出时,最新提交不在那里。应用
FETCH_HEAD
的强力解决方案是在LOC上简单地应用git reset --soft FETCH_HEAD
。之后,您将看到所有新的提交。另一种解决方案(如the answer to How do I update my bare repo?中所述)是首先使用
git fetch *:*
,我找不到将*:*
传递给git submodule update
的方法,但也许有一种方法。正如评论中提到的,
git clone
的--mirror
选项做的正是它应该做的:它镜像了远程数据库,任何额外的分支或提交都会被丢弃,所以这对于备份来说很好,但是如果你想要的不是一个精确的副本,这就不好了。