5

例如,假设我有 Repository 1 和 Repository 2。Repository 1 有一个 file /a/b/c/d。我可以将这个文件导入到 Repository 2 中/e/f/g/h吗?

原因是我想从不同的 git 存储库的实验分支中提取更改。我尝试将所有内容合并在一起,但存在大量冲突(各种)。因此,我怀疑我是否可以合并整个分支,但我想尽可能多地引入。

有什么办法可以做我想做的事,还是我只能求助于直接复制文件?

4

3 回答 3

2

您可以使用git archive. 然后,您可以将文件添加并提交到您的存储库。这种方法不会保留他分支的历史。有关详细信息,请参阅git 存档文档

如果您想尝试保留该实验分支的部分内容,您可以将git fetch他的存储库,然后将git rebase他的实验分支放到您的存储库中,根据需要编辑或跳过有冲突的提交。在存储库中清理干净分支后,可以将其合并。请参阅git rebase 文档

于 2010-01-22T13:48:32.923 回答
1

您必须直接复制该文件。Git 处理整个存储库,而不是其中的单个文件。

我想您可以将存储库 2 设置为远程存储库,获取(而不是拉取)其分支,然后用于git checkout从该分支中​​获取文件,但该解决方案可能会很混乱。

于 2010-01-20T20:01:56.467 回答
1

没有简单的解决方法,但这里有一个写得很好的指南(将文件从一个存储库移动到另一个存储库,保留 git 历史记录) ,作者是Ayushya Jaiswal,我将在这篇文章中引用它以用于存档目的。

tl;dr:您实际上是在重新构建一个 repo(安全地)并仅提取您想要的文件。然后将 git 历史从你的 rebase 仓库拉到你当前正在处理的任何仓库中。

开始之前的注意事项:如果您需要特定文件,则还
需要https://stackoverflow.com/a/56334887/929999 。我将在下面引用的指南中添加免责声明,以便在此步骤中添加。

以下是文章中引用的文字:


准备好从存储库 A 移动的文件。

第 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

将文件合并到新的存储库 B.

第 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 中在线获得。

于 2019-10-23T10:23:15.240 回答