例如,假设我有Repository 1和Repository 2. Repository 1有一个文件/a/b/c/d
。我可以将此文件作为/e/f/g/h
导入到存储库2中吗?
原因是我想从不同的git存储库中的实验分支中获取更改。我尝试将所有东西合并在一起,但是存在大量的冲突(各种冲突)。因此,我怀疑我可以合并整个分支,但我想尝试尽可能多地引入。
有没有办法做我想做的事情,或者我只是不得不直接复制文件?
答案 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。我将在引用的指南下方的此步骤中添加免责声明。
这是文章中引用的文字:
第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
这是修改步骤,可通过执行here的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中在线获得。