将文件移动到单独的存储库,而不移动磁盘上的文件



这个问题与例如如何将文件从一个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 commitgit push时,对file1.txt的更改应转到repo1,对file2.txt的更改应转至repo2

作为一种变通方法,我可以在def中创建一个额外的目录,并将file2.txt移动到那里,如果这样做更容易的话。但是,我不想将file2.txt移出当前树。

CCD_ 17的历史不一定需要在这次移动中保留。

首先,确保提交或隐藏任何更改,并且工作树是干净的。运行git status以确定。

通过两个简单的步骤就可以实现你的目标。

  1. abc/def中创建一个新的空回购。将其配置为忽略除file2.txt之外的所有内容(您希望以与file2.txt相同的方式处理的任何其他文件)。将.gitignorefile2.txt添加到新的回购并提交:

    $ cd abc/def
    $ git init
    $ echo '*' > .gitignore
    $ echo '!/file2.txt' >> .gitignore
    $ git add .
    $ git status
    $ git commit
    

    仔细阅读git status的输出,并验证它只向repo添加了所需的文件。如果一切正常,请提交,或者调整.gitignore和索引,直到它们达到您需要的状态。

  2. 转到abc回购,将def/file2.txtdef/.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/defrepo时运行此命令行,也可以在创建后运行它。回购中包含的数据是安全的。它只会将回购移动到指定的位置。

相关内容

  • 没有找到相关文章

最新更新