gpt4 book ai didi

git - 有什么办法让git将master中的文件添加到其他10个分支中?

转载 作者:太空狗 更新时间:2023-10-29 13:54:30 25 4
gpt4 key购买 nike

有什么方法可以告诉git在其他分支中添加一个新文件吗?
不是每个分支都git checkout <branch>; git merge master,而是下面每个分支都有添加新文件的快捷方式吗?

     master
+-----newfile
|
---
/ | \
/ | \
/ | \
foo bar baz

编辑:这是我想到的bash脚本(如果实现的话需要一些清理),但希望有更好的方法。
MSG='added newfile which contains a method to workaround issue IS-797'
for branch in $(git branch | grep -v master | sed 's#^[ *\t]##g'); do
echo merging into $branch
git checkout $branch && git merge master -m "$MSG"
done

最佳答案

有两种方法可以解决这个问题。在我看来,其他评论/回答(截至本文撰写时)中的大多数建议都是可疑的。这里有一个不同的选择,有正反两方面。
首先,对于最终历史的样子,至少有三种不同的选择。各有利弊。某种程度上。更像是每一种都有缺点,优点是它没有其他方式的缺点。
它看起来就像文件“总是在那里”,因为在创建受影响的分支之前。最大的缺点是,这是一次历史改写,而且会产生后果。
看起来文件是由每个分支独立添加的。这个文件很可能最终会有一个难以读取的历史记录,并且存在很多可以避免的合并冲突。但是,这并不能改写历史。
它看起来像是文件被添加了一次,然后合并到每个分支中。有些人真的讨厌合并提交,即使有些人并不特别讨厌合并提交,我认为这种方法会导致混乱的分支拓扑。但是,它避免了历史的重写,并且可以很好地向前发展;也就是说,它在功能上是最干净的选择,但在美学上是粗糙的。
更详细地看每一个:
改写历史:
如果您单独使用您的回购,并且您从未做过任何使您现有的提交ID(“哈希”)重要的事情,那么这是一个相当吸引人的选择。即使您共享了repo,只要您与repo的其他用户进行协调,就可以使其正常工作。
对于大型重写,我的一般建议是与每个人协调,以便在所有工作都推送到回购协议时有一个固定的日期/时间。然后每个人都放弃他们的克隆,你重写,每个人都重新克隆。如果这不实用,那么大的重写可能不是一个好主意;但是如果您无论如何都想考虑它,请阅读git rebase文档中的“从上游回扣中恢复”以获取有关将要发生的事情的更多信息。
我想,rebase是重写历史的典型方法,在这种情况下几乎肯定是错误的。如果你有很多分支,你必须做很多次。如果你有一个复杂的历史,它变得很难做正确的。尤其是它不能很好地处理合并(即使是最近添加的改进)。
相反,您可以使用git filter-branch。简单的方法是使用--tree-filter。你可以把文件的副本放在工作树外的某个地方,然后

git filter-branch --tree-filter 'cp /path/to/stored/copy/of/file path/to/file/in/worktree' -- --all

然后 filter-branch将继续签出历史记录中的每个提交,运行 cp命令将文件添加到该提交的工作树中,并使用生成的内容编写新的提交。然后它将把分支从旧的提交转移到新的提交。如果您有标记并希望它们也移动,请添加一个 --tag-name-filter参数,如
git filter-branch --tree-filter 'cp /path/to/stored/copy/of/file path/to/file/in/worktree' --tag-name-filter cat -- --all

问题是,如果你的历史是大的,这个过程是缓慢的。您可以通过对工作树使用ramdisk(请参见 -d选项)或使用 --index-filter而不是 --tree-filter(但这需要您使用不同的命令来直接更新索引,这并不十分简单)。
每个分支添加文件
这就是 cherry-pick能带给你的。因为问题是如何自动化流程,所以不清楚为什么有人用 cherry-pick评论,好像这是一个解决方案。这个过程就像合并一样是手动的(也可以编写脚本)。
唯一的区别是,当您这样做时,git会创建独立的提交,分别在每个分支上添加文件。
您可以使用与合并时相同的基本脚本,只需将 merge命令替换为 cherry-pick命令。
合并
为此,您已经制定了一个合理的解决方案-您需要一个脚本。我唯一要注意的是, git for-each-ref通常是一个更适合输入脚本的命令,而不是 git branchhttps://git-scm.com/docs/git-for-each-ref

关于git - 有什么办法让git将master中的文件添加到其他10个分支中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52333842/

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