【发布时间】:2016-09-12 20:50:20
【问题描述】:
我的一位大学同事认为,通过克隆一个存储库并将其内容复制到一个新的、新初始化的存储库中,但没有原始存储库中的 .git 文件夹,这是一个好主意。之后,他只需使用一次提交就提交了这个副本,整个团队就开始基于这个提交来处理项目:
A <- B <- C <- D <- E (original repository)
\ clone / |_____|
\ / |
\ / Ofc. work on the original repository was continued after cloning...
\ /
M <- N <- O <-P (our "fork", commits from my team)
现在,我的第一个目标是获得以下存储库结构:
A <- B <- C <- N <- O <- P
过去几个小时我一直在尝试做的事情如下:
- 克隆原始存储库。
-
git diff > /path/to/patch来自分叉。 -
git apply在原始存储库中。 - 有效,但不保留提交。
- 其他各种不起作用的东西。
- 克隆原始存储库。
- 创建并切换到新分支。
- 使用
git reset --hard COMMIT_HASH_A将其重置为提交A。 - 使用 fork 上的
git format-patch COMMIT_HASH_M --stdout > /path/to/patch从N <- O <- P创建补丁。 - 使用
git am -3 /path/to/patch在原始存储库上应用此补丁。在解决了多次创建空文件等冲突后,这将导致以下错误:fatal: sha1 information is lacking or useless (some_file_name). Repository lacks necessary blobs to fall back on 3-way merge.这是我不能上的地方。
那么,我如何创建一个存储库,包括来自原始存储库和我们团队的所有提交,如上所述,以便最终可以将拉取请求发送到原始存储库? git-rebase 有帮助吗?
【问题讨论】:
-
使用移植和过滤分支。
-
有更智能的方法可以做到这一点,但一个后备方案是对 N、O 和 P 中的每一个使用
git log -n 1 -p,然后将它们一个一个地应用到原始仓库克隆中的一个分支上patch -p1并根据需要手动添加和删除文件。如果它少于 50 次左右的提交,那么它可能比以官方方式进行战斗要快。 -
我只想指出,如果你没有
.git文件夹,你就没有“新初始化的存储库”。我假设您的意思是他将文件复制到了一个空目录。 -
我的意思是,他将没有
.git文件夹的原始存储库中的文件复制到一个空目录中,以便在目标目录中初始化一个新的存储库。
标签: git git-rebase git-rewrite-history git-patch