这个问题与例如如何将文件从一个git repo移动到另一个git repo(而不是克隆)、保存历史有关将子目录分离(移动)到单独的Git存储库中,但问题(或者至少是解决方案,我认为)不同。我有以下目录结构:
abc/
.git/
def/
file1.txt
file2.txt
xyz/
file3.txt
目录abc
是git存储库的根目录,比如repo1
。
我想要的是将file2.txt
放在另一个存储库repo2
(本地并链接到远程)中。但是,我不想将file2.txt
移出目录(如相关问题中所述)。所有其他文件和文件夹(def, file1.txt, xyz/*
)必须保留在repo1
中。
当我执行git commit
或git push
时,对file1.txt
的更改应转到repo1
,对file2.txt
的更改应转至repo2
。
作为一种变通方法,我可以在def
中创建一个额外的目录,并将file2.txt
移动到那里,如果这样做更容易的话。但是,我不想将file2.txt
移出当前树。
CCD_ 17的历史不一定需要在这次移动中保留。
首先,确保提交或隐藏任何更改,并且工作树是干净的。运行git status
以确定。
通过两个简单的步骤就可以实现你的目标。
-
在
abc/def
中创建一个新的空回购。将其配置为忽略除file2.txt
之外的所有内容(您希望以与file2.txt
相同的方式处理的任何其他文件)。将.gitignore
和file2.txt
添加到新的回购并提交:$ cd abc/def $ git init $ echo '*' > .gitignore $ echo '!/file2.txt' >> .gitignore $ git add . $ git status $ git commit
仔细阅读
git status
的输出,并验证它只向repo添加了所需的文件。如果一切正常,请提交,或者调整.gitignore
和索引,直到它们达到您需要的状态。 -
转到
abc
回购,将def/file2.txt
和def/.gitignore
添加到此回购的忽略列表中,从索引中删除def/file2.txt
并提交:$ cd .. $ echo '/def/file2.txt' >> .gitignore $ echo '/def/.gitignore' >> .gitignore $ git rm --cached def/file2.txt $ git status $ git commit
再次,在提交之前读取
git status
的输出。
备注
你可以像往常一样处理这两个回购。它们是独立的,没有以任何方式链接(除了每个repo被配置为忽略另一个repo管理的文件之外)。
如果您不将内部repo推送到远程位置,我建议您将其.git
目录(存储库本身)移动到abc
目录之外的某个位置,以防止意外删除。命令很简单。在abc/def
目录内运行:
git init --separate-git-dir=/path-where-to-move-the-git-dir
您可以在创建abc/def
repo时运行此命令行,也可以在创建后运行它。回购中包含的数据是安全的。它只会将回购移动到指定的位置。