我可以只从另一个git存储库中提取某些文件吗?

时间:2010-01-20 19:51:59

标签: git branch merge git-branch

例如,假设我有Repository 1和Repository 2. Repository 1有一个文件/a/b/c/d。我可以将此文件作为/e/f/g/h导入到存储库2中吗?

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

有没有办法做我想做的事情,或者我只是不得不直接复制文件?

3 个答案:

答案 0 :(得分:1)

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

我想您可以将Repository 2设置为远程存储库,获取( not pull)其分支,然后使用git checkout从该分支中​​获取文件,但该解决方案可能很乱。

答案 1 :(得分:1)

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

如果您想尝试保留该实验分支的一部分,您可以git fetch他的存储库,然后git rebase他的实验分支到您的存储库,编辑或跳过适当的冲突提交。在存储库中有一个已清理的分支后,您可以将其合并。请参阅git rebase docs

答案 2 :(得分:0)

没有简单的修复方法,但是有 Ayushya Jaiswal 编写的指南here (Move files from one repository to another, preserving git history),编写得非常好,出于存档目的,我将在本文中引用它。

tl; dr :从本质上讲,您是在(安全地)重新构建存储库,并仅提取所需的文件。然后将git历史记录从您的基础存储库中提取到当前正在使用的任何存储库中。

开始之前的注意事项
如果您要特定的文件,则也需要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

这是修改步骤,可通过执行heregit 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中在线获得。