gpt4 book ai didi

git - "Frankensteining"来自 git 存储库的分支 - 允许 merge 移动的文件

转载 作者:太空狗 更新时间:2023-10-29 14:18:33 24 4
gpt4 key购买 nike

我想从 Arduino repository 创建一个分支为了创建 AVR 核心和库的独立版本,但我想:

  1. 隔离其中的一些,这样只有 libraries/hardware/arduino/avr/cores/arduino/(移动到 core/) 是从原始存储库派生的,并且

  2. 允许 merge 回原始存储库以及从原始存储库更新。

我已经 readreadread , 但它们似乎都不符合第二个要求。

我也有兴趣了解其他工具如何/是否可以处理此问题,但考虑到源存储库是 git,那将是我选择的工具。

最佳答案

您想要的是可能的,但两个存储库的同步需要一些工作。

任何涉及 git-filter-branch 的策略在这里不适合,因为您通过重写 fork 的历史记录失去了两个 repo 协议(protocol)之间的联系。

为了说明这样做的基本原理,让我们创建一个测试存储库

> git init merge-move-test && cd merge-move-test/
@master> echo "foo" > foo
@master> git add .
@master> git commit -m "Initial commit"

接下来我们创建我们的 fork 来移动东西

@master> git checkout -b fork
@fork> git mv foo bar
@fork> git commit -m "Rename foo to bar"
@fork> git tag rename-commit

在你 fork 后不久,上游进行了修改

@master> echo "Upstream update" > foo
@master> git commit -am "Upstream update of foo"

此时你可以很容易地让你的fork与master保持同步

@fork> git merge --no-edit master

就是这样。看一下diff,你会发现效果完全符合预期

@fork> git diff HEAD^ HEAD
diff --git a/bar b/bar
index 257cc56..f7f3304 100644
--- a/bar
+++ b/bar
@@ -1 +1 @@
-foo
+Upstream update

此时进行本地开发和 merge 上游更改不需要特殊步骤。

当您想将更改 merge 回上游时,这会变得很有趣。因此,假设您在 master 中引入了一些惊人的变化

@fork> echo "Improvement from fork" > bar
@fork> git commit -am "Improve bar in fork"

如果你只想 merge fork进入master现在,您不仅可以将内容更改应用于 foo , 同时重命名 foobar .这是有道理的,因为这正是 fork 的一组变化。那个主人还没见过。

所以我们需要做的是告诉 master我们不想要那 block 零钱。一种方法是 merge 所有内容,然后还原不需要的更改。如果你想在一次提交中拥有所有内容,这将是实现它的方式

@master> git merge --no-commit --no-ff fork
@master> git revert --no-commit rename-commit
@master> git commit -m "Merge improvement from fork"

另一种方法是首先使用策略 ours merge 不需要的更改接下来是实际的 merge 。

@master> git merge --no-edit -s ours rename-commit
@master> git merge --no-edit fork

More information on excluding changes from a merge.

完成之后,情况就有点相反了。您现在可以 merge 来自 fork 的任意数量的更改进入master , 但尝试执行相反的操作将撤消您在 fork 中的初始重命名。 ,因为这是 merge 提交的一部分 master .

所以每次你想 merge 来自 A 的更改时至 B , 必须确保这些不包括来自 B 的更改的逆转在A .如果有任何此类更改,请使用上述方法之一恢复它们。

如果你想尝试一下测试仓库,here's a shell script that runs the above commands .

关于git - "Frankensteining"来自 git 存储库的分支 - 允许 merge 移动的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31757877/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com