例如,假设我有 Repository 1 和 Repository 2。Repository 1 有一个 file /a/b/c/d
。我可以将这个文件导入到 Repository 2 中/e/f/g/h
吗?
原因是我想从不同的 git 存储库的实验分支中提取更改。我尝试将所有内容合并在一起,但存在大量冲突(各种)。因此,我怀疑我是否可以合并整个分支,但我想尽可能多地引入。
有什么办法可以做我想做的事,还是我只能求助于直接复制文件?
例如,假设我有 Repository 1 和 Repository 2。Repository 1 有一个 file /a/b/c/d
。我可以将这个文件导入到 Repository 2 中/e/f/g/h
吗?
原因是我想从不同的 git 存储库的实验分支中提取更改。我尝试将所有内容合并在一起,但存在大量冲突(各种)。因此,我怀疑我是否可以合并整个分支,但我想尽可能多地引入。
有什么办法可以做我想做的事,还是我只能求助于直接复制文件?
您可以使用git archive
. 然后,您可以将文件添加并提交到您的存储库。这种方法不会保留他分支的历史。有关详细信息,请参阅git 存档文档。
如果您想尝试保留该实验分支的部分内容,您可以将git fetch
他的存储库,然后将git rebase
他的实验分支放到您的存储库中,根据需要编辑或跳过有冲突的提交。在存储库中清理干净分支后,可以将其合并。请参阅git rebase 文档
您必须直接复制该文件。Git 处理整个存储库,而不是其中的单个文件。
我想您可以将存储库 2 设置为远程存储库,获取(而不是拉取)其分支,然后用于git checkout
从该分支中获取文件,但该解决方案可能会很混乱。
没有简单的解决方法,但这里有一个写得很好的指南(将文件从一个存储库移动到另一个存储库,保留 git 历史记录) ,作者是Ayushya Jaiswal,我将在这篇文章中引用它以用于存档目的。
tl;dr:您实际上是在重新构建一个 repo(安全地)并仅提取您想要的文件。然后将 git 历史从你的 rebase 仓库拉到你当前正在处理的任何仓库中。
开始之前的注意事项:如果您需要特定文件,则还
需要https://stackoverflow.com/a/56334887/929999 。我将在下面引用的指南中添加免责声明,以便在此步骤中添加。
以下是文章中引用的文字:
第 1 步:制作存储库 A 的副本,因为以下步骤对此副本进行了重大更改,您不应该推送!
mkdir cloneA
cd cloneA
git clone --branch <branch> --origin origin --progress \
-v <git repository A url>
# eg. git clone --branch master --origin origin --progress \
# -v https://github.com/username/myproject.git
# (assuming myprojects is the repository you want to copy from)
第 2 步:转到该目录。
cd <git repository A directory>
# eg. cd myproject
# Folder Path is ~/cloneA/myproject
第 3 步:为避免意外进行任何远程更改(例如通过推送),请删除指向原始存储库的链接。
git remote rm origin
这是修改git filter-branch --prune-empty ... $FILES
的步骤,改为从此处执行该步骤来修改它,这将仅推断您想要的文件。其余的应该是一样的。
在你的情况下,它会是这样的:
FILES='/a/b/c/d'
git filter-branch --prune-empty --index-filter "
git read-tree --empty
git reset \$GIT_COMMIT -- $FILES
" \
-- --all -- $FILES
第 4 步:浏览您的历史记录和文件,删除任何不在FOLDER_TO_KEEP
. 结果是将内容FOLDER_TO_KEEP
喷出到存储库 A 的基础中。
git filter-branch --subdirectory-filter <directory> -- --all
# eg. git filter-branch --subdirectory-filter subfolder1/subfolder2/FOLDER_TO_KEEP -- --all
第 5 步:清理不需要的数据。
git reset --hard
git gc --aggressive
git prune
git clean -fd
第 6 步:将所有文件和目录移动到您要推送到存储库 B 的 NEW_FOLDER。
mkdir <base directory>
#eg mkdir NEW_FOLDER
mv * <base directory>
#eg mv * NEW_FOLDER
或者,您可以使用 GUI 将所有文件和目录拖到 NEW_FOLDER。
第 7 步:添加更改并提交。
git add .
git commit
第 1 步:如果您还没有存储库 B,请制作一个副本。
mkdir cloneB
cd cloneB
git clone <git repository B url>
# eg. git clone
https://github.com/username/newproject.git
第 2 步:转到该目录。
cd <git repository B directory>
# eg. cd newproject
# Folder Path is ~/cloneB/newproject
第 3 步:创建到存储库 A 的远程连接,作为存储库 B 中的分支。
git remote add repo-A <git repository A directory>
# (repo-A can be anything - it's just a random name)
# eg. git remote add repo-A ~/cloneA/myproject
第 4 步:从该分支(仅包含您要移动的目录)中提取文件和历史记录到存储库 B。
git pull repo-A master --allow-unrelated-histories
# This merges master from repository A into repository B
第 5 步:删除与存储库 A 的远程连接。
git remote rm repo-A
第 6 步:最后,推送更改
git push
您可以删除两个克隆的存储库。
带有历史记录的文件更改现在可以在存储库 B 中在线获得。