【发布时间】:2019-07-29 02:32:41
【问题描述】:
我需要使用应该适用于 Linux 和 MacOS 的 Bash 脚本来扩展给定工具。该脚本有 2 个参数:
- 存储库位置(文件系统、ssh、http(s)、...)
- commitish,例如分支、标签、提交哈希
我对参数没有影响
脚本运行的结果应该是这样的
- 存储库被克隆到固定目标(一个存储库始终相同)
- 存储库的工作树应对应于提交的最新状态(例如,如果它是一个分支,则该分支的尖端)
如果本地(还)不存在存储库,则过程很简单
git clone $REPO_SOURCE $REPO_DIR
cd $REPO_DIR
git checkout $REPO_REF
我的问题:考虑一个存储库已经克隆到/repos/foo。在 obvios git fetch 之后,如何将该存储库更新为提供的 $REPO_REF?
- 如果
$REPO_REF是一个分支,那么git checkout $REPO_REF && git pull应该可以工作 - 如果是提交哈希,则不需要更新(只需
git checkout $REPO_REF?) - 如果是标签,那么标签可能已经在原点上移动了,如何处理?
- 如何处理其他极端情况?
是否有一种简单的reset-repository-to-this-commitsh 方式,使存储库的行为就像它是新克隆的一样?
侧节点:
- 同一存储库可能与不同的提交一起使用,但只能按顺序使用:保证不会同时调用脚本多次
- 对存储库的所有外部更改可能总是在不通知的情况下被丢弃
- 虽然删除和克隆存储库会起作用,但由于它们的大小和它是一个丑解决方案 ,这是不切实际的
- 不需要 (git) 更改,因此检查分离的头部是可以的
【问题讨论】: