gpt4 book ai didi

git - 如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史

转载 作者:IT王子 更新时间:2023-10-29 01:10:31 25 4
gpt4 key购买 nike

我们的 Git 存储库最初是作为单个怪物 SVN 存储库的一部分,其中每个项目都有自己的树,如下所示:

project1/branches
/tags
/trunk
project2/branches
/tags
/trunk

显然,使用 svn mv 将文件从一个文件移动到另一个文件非常容易。但是在 Git 中,每个项目都在自己的存储库中,今天我被要求将一个子目录从 project2 移动到 project1。我做了这样的事情:

$ git clone project2 
$ cd project2
$ git filter-branch --subdirectory-filter deeply/buried/java/source/directory/A -- --all
$ git remote rm origin # so I don't accidentally overwrite the repo ;-)
$ mkdir -p deeply/buried/different/java/source/directory/B
$ for f in *.java; do
> git mv $f deeply/buried/different/java/source/directory/B
> done
$ git commit -m "moved files to new subdirectory"
$ cd ..
$
$ git clone project1
$ cd project1
$ git remote add p2 ../project2
$ git fetch p2
$ git branch p2 remotes/p2/master
$ git merge p2 # --allow-unrelated-histories for git 2.9+
$ git remote rm p2
$ git push

但这看起来很复杂。一般来说,有没有更好的方法来做这种事情?还是我采用了正确的方法?

请注意,这涉及将历史 merge 到现有存储库中,而不是简单地从另一个存储库的一部分创建一个新的独立存储库 (as in an earlier question)。

最佳答案

如果您的历史是正常的,您可以将提交作为补丁取出并将它们应用到新的存储库中:

cd repository
git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder > patch
cd ../another_repository
git am --committer-date-is-author-date < ../repository/patch

或者在一行中

git log --pretty=email --patch-with-stat --reverse --full-index --binary -m --first-parent -- path/to/file_or_folder | (cd /path/to/new_repository && git am --committer-date-is-author-date)

(摘自Exherbo’s docs)

关于git - 如何将一些文件从一个 git repo 移动到另一个(不是克隆),保留历史,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1365541/

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