0

这个问题与,例如,如何将文件从一个 git 存储库移动到另一个(不是克隆),保留历史记录 分离(移动)子目录到单独的 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 commitorgit push时,更改为file1.txt应该去repo1和更改为file2.txt应该去repo2

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

历史file2.txt并不一定需要在这一举动中保存下来。

4

1 回答 1

1

首先,确保您提交或存储任何更改并且您的工作树是干净的。跑去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. 转到abcrepo,添加def/file2.txtdef/.gitignore到此 repo 的忽略列表,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在提交之前阅读输出。

评论

您可以像往常一样使用这两个存储库。它们是独立的,它们没有以任何方式链接(除了每个存储库都配置为忽略另一个存储库管理的文件这一事实)。

如果您不将内部存储库推送到远程位置,我建议您将其.git目录(存储库本身)移动到目录之外的某个位置,abc以防止其意外删除。命令很简单。在abc/def目录内运行:

git init --separate-git-dir=/path-where-to-move-the-git-dir

您可以在创建abc/def存储库时运行此命令行,也可以在此之后运行它。回购中包含的数据是安全的。它只会将 repo 移动到指定的位置。

于 2017-02-08T13:32:58.173 回答