gpt4 book ai didi

bash - git filter repo 可以根据日期从许多 repos 交织提交中创建一个 monorepo 吗?

转载 作者:行者123 更新时间:2023-12-03 19:10:46 27 4
gpt4 key购买 nike

使用 git-filter-repo是否可以将 N 个存储库组合成一个单一存储库,重写提交,以便提交交织在一起,或者按日期“压缩”?
目前,我只使用 2 个 repo 进行测试,每个 repo 都有自己的子目录。操作之后,每个 repo 的提交都在彼此的“顶部”而不是交织在一起。我真正想要的是能够在没有添加 merge 提交的情况下通过创作数据获得完全线性的历史记录。

history


rm -rf ___x
mkdir ___x
cd ___x

echo "creating the monorepo"
git init
touch "README.md"
git add .
git commit -am "Hello World!"

declare -A data
data=(
["foo"]="https://github.com/bcanzanella/foo.git"
["bar"]="https://github.com/bcanzanella/bar.git"
)

for d in "${!data[@]}";
do {
REPO_NAME=$d
REPO_REMOTE=${data[$d]}

# since we can use a foo/bar as the repo identifier, replace the / with a -
REPO_DIR_TMP="$(mktemp -d -t "${REPO_NAME/\//-}.XXXX")"

echo "REPO REMOTE: $REPO_REMOTE"
echo "REPO NAME: $REPO_NAME"
echo "REPO TMP DIR: $REPO_DIR_TMP"
echo ""

echo "Cloning..."
git clone "$REPO_REMOTE" "$REPO_DIR_TMP"

echo "filtering into ..."
cd $REPO_DIR_TMP && git-filter-repo --to-subdirectory-filter "$REPO_NAME"
# cat .git/filter-repo/commit-map

## merge the rewritten repo
git remote add "$REPO_NAME" "$REPO_DIR_TMP"

echo "fetching..."
git fetch "$REPO_NAME"

echo "merging..."
git merge --allow-unrelated-histories "$REPO_NAME/master" --no-edit

## delete the rewritten repo
echo "Removing temp dir $REPO_DIR_TMP..."
rm -rf "$REPO_DIR_TMP"

echo "Removing remote $REPO_NAME..."
# git remote rm "$REPO_NAME"

echo "$REPO_NAME done!"
}
done

最佳答案

强调 eftshift0 的评论:rebase 和重写历史可能导致提交以看似荒谬的时间顺序排列。

如果您知道所有提交都是有序的(例如:父提交的提交日期总是比其子提交的提交日期“早”),您可能能够生成正确的提交列表以供馈送在 git rebase -i脚本。

[编辑] 考虑之后,这对于您的用例来说可能就足够了:

使用 --date-order 查看您的 repo 历史记录:

git log --graph --oneline --date-order

如果提交的顺序符合您的预期,您可以使用 git log生成 rebase -i序列脚本:
# --reverse   : 'rebase -i' asks for entries starting from the oldest
# --no-merges : do not mention the "merge" commits
# sed -e 's/^/pick /' : use any way you see fit to prefix each line with 'pick '
# (another valid way is to copy paste the list of commits in an editor,
# and add 'pick ' to each line ...)
git log --reverse --no-merges --oneline --date-order |\
sed -e 's/^/pick /' > /tmp/rebase-apply.txt

然后重新设置您的 repo 的完整历史记录:
git rebase -i --root

在编辑器中,复制/粘贴您使用第一个命令创建的脚本,
保存并关闭。

希望你会得到一个不冲突的统一历史。

关于bash - git filter repo 可以根据日期从许多 repos 交织提交中创建一个 monorepo 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62270074/

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