- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关于处理merge
重命名还有其他答案,但是我的情况非常复杂,以至于我认为这值得一个单独的问题。
我们有一个git项目,最初由20多个存储库组成。我们使用包装器脚本来处理许多标准git操作。因为我们现在要迁移到GitHub,所以我们不能以这种方式处理项目。
因此,我们基本上使用saintgimp上描述的方法将所有存储库移动到单个存储库中。当然,这意味着所有文件现在都已重命名,但是SHA在历史上是相同的。
好的,所以现在我想将分支source
合并到分支target
中,请注意,我确保在最后一次转换之前两者已同步。我的第一次尝试使用git merge <source>
导致了成千上万的冲突,关于在一侧或另一侧更改/删除文件的投诉等。
然后我在Advanced Merging page上找到了一个宝石:
如果您想做这样的事情,但连Git都没有,请尝试
从另一侧合并更改,这是更严厉的
选项,这是“我们的”合并策略。这不同于
“我们的”递归合并选项。
啊,听起来像我需要的。好的,我执行了以下操作:
$ git merge -s ours SHA
SHA
是统一的最后一次提交。换句话说,我希望所有历史记录(包括
SHA
在内)都已被合并为
target
。我希望这将是一次合并,并将解决所有将来的合并。
source
的第一个新提交时,效果是正确的,但是我继续收到以下警告:
[user@host src] git merge --no-commit next_unmerged_commit
Auto-merging /path/to/file/changed/foo.c
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your merge.renamelimit variable to at least 5384 and retry the command.
Automatic merge went well; stopped before committing as requested
renamelimit
设置为10000,则执行下一个合并(称为
B
)时不会发出警告,但是会降低性能。再一次,一次性费用是可以接受的,如果我的后续合并再次恢复正常,我将支付该费用。
C
的下一个合并
renamelimit
再次发出警告。
target
分支与
source
保持同步,以便它在统一之前不再试图恢复历史?由于性能下降,我希望能够在不增加
renamelimit
的情况下进行合并。
最佳答案
这确实不是一个很好的答案,因为它更多地与您使用的脚本有关,或者也许我应该说,您未使用的脚本,如your comment说您使用的是基于the script to which you linked的脚本,但我图11显示了我在下面的一些原始存储库的假设脚本转换中得到的缠结图。请注意,此特定脚本使所有转换都具有一个合并基本提交,实质上是commit B
,而commit B
本身为空。
您的问题是:
现在,我想将分支source
合并到分支target
中,请注意,我确保在最后一次转换之前两者已同步。
正如您将在下面看到的那样,所有新分支都以它们来自的项目命名—没有明确的方法将source
和target
映射到例如P或Q上。但是,如果要运行:
git checkout P/master
git merge Q/master
git merge
的合并基础将为empty-commit-
B
,并且合并将顺利进行:Git会分别查看我作为
D
和
H
绘制的提交,并跟踪它们祖先,找到提交
B
作为其合并基础,然后运行两个
git diff
:
git diff <hash-of-B> <hash-of-D> # what we did on P/master
git diff <hash-of-B> <hash-of-H> # what they did on H/master
git diff
的输出将表明每个文件都是从头开始创建的,并且它们的名称都不同:
P/master
中的所有内容都命名为
P/*
,而
H/master
中的所有内容都命名为
Q/*
。不会发生名称冲突,合并将自行完成。
git checkout P/master # just to be somewhere that's not master
git branch -d master # discard existing master branch name
git checkout --orphan master # arrange to create new master
git merge P/master Q/master R/master # make big octopus merge to marry all projects
B
,结果将是一次合并,使所有项目以其新的
project/*
名称进入。现在,原始存储库几乎都没有用,但是如果其中有新的提交,则可以从它们中获取信息,添加重命名提交,然后从重命名提交进行合并(如果导入脚本没有删除添加的内容,这样做会更容易遥控器)。
git read-tree
和
git commit-tree
来构建和创建章鱼末端合并。主键是在下图中的每个传入项目分支(
P/*
,
Q/*
等)的末尾添加重命名提交。
A--B <-- master
git remote add P <url>
和
git fetch P
(带有
--tags
!?)。我们在这里假设P具有master和dev。
A--B <-- master
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
refs/remotes/P/*
中具有相同的名称集。 (假设
git checkout -b P/master master
。影响:
A--B <-- master, P/master
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git reset --hard
:无效果。也许
git clean -d --force
:无效果。
git merge --allow-unrelated-histories --no-commit remotes/P/master"
(does merge, but does not commit yet) and then run
git commit -m ...`。
A--B <-- master
\
\-------C <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git mv all-but-P P/
git commit -m "[Project] Move ${sub_project} files into sub directory"
A--B <-- master
\
\-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git mv
指定了
-k
,因此,如果
git mv
操作之一将失败。但是,除了
.git
本身,位于顶层的所有文件
git mv
应该
P
,否则成功。
D
不存在。
dev
重复循环(请参阅步骤5)。运行
git checkout -b P/dev master
:
A--B <-- master, P/dev
\
\-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
Pd <-- origin/P/dev
git reset
和
git clean
再次
git mv
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
\ Pd <-- origin/P/dev
\ \
\---E <-- P/dev
master
的子目录中,也没有
dev
。
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm <-- origin/P/master
\
\ Pd <-- origin/P/dev
\ \
\---E--F <-- P/dev
origin/P/*
名称,
P/*
分支:
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
--tags
,不是步骤5中指出的好计划
origin/Q/*
名称的不相交子图。为简单起见
origin/Q/master
存在:
A--B <-- master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
Q1-Q2-...-Qm <-- origin/Q/master
git checkout -b Q/master master
:
A--B <-- master, Q/master
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
Q1-Q2-...-Qm <-- origin/Q/master
git reset --hard
和
git clean
步骤。
--allow-unrelated-histories
使用时髦的两步合并
G
,如下所示:
---------------G <-- Q/master
/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm <-- origin/Q/master
---------------G--H <-- Q/master
/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm <-- origin/Q/master
Q
和
origin/Q/*
名称。 (无需绘制。)
master
,我们将得到如下图所示的纠结图:
--------------------I--J <-- R/master
/ | (down to Rm)
/
| ---------------G--H <-- Q/master
|/ |
A--B <-- master | (down to Qm)
|\
| \-------C--D <-- P/master
/
P1-P2-...-Pm
\
\ Pd
\ \
\---E--F <-- P/dev
/ (up to G)
/
Q1-Q2-...-Qm
/ (up to I)
/
R1-R2-...----Rm
关于git - 重命名所有文件后git merge,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55285121/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!