【问题标题】:Make subdirs of git repository their own git repos使 git 存储库的子目录成为自己的 git 存储库
【发布时间】:2009-12-30 03:45:27
【问题描述】:

事实证明,这个问题问了同样的问题Detach (move) subdirectory into separate Git repository

我决定学习 git 并将我的编程作业保存在 git repo 中。我认为这是个好主意。现在我想知道一些事情:

我有一个 git 存储库,每个任务都有一个子目录。我想知道是否有一种理智的方法可以将每个子目录变成自己的 git repo,并保留与这些文件关联的历史记录。似乎“git filter-branch --subirectory-filter”是答案的一部分,但我不确定该怎么做。

编辑

澄清一下:我的结构是这样的

超级目录 .git 子目录1 子目录2 子目录3

我希望我的结构更像这样

超级目录 子目录1 .git 子目录2 .git 子目录3 .git

我可以吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    您可能正在寻找git submodules,但我只是将您的布局更改为让顶级不是成为git repo,而只是让subdir repos独立管理。

    【讨论】:

    • 所以我想到了这一点,但据我了解,这需要子目录已经是他们自己的 git 存储库;我错了吗?
    • 是的,我的任何一个建议都要求子目录是 git repos。进入filter-branch 只是一个痛苦的秘诀。
    • 您可以一次性遍历所有内容,并使用类似于此处接受的答案中描述的过程使它们成为仓库:stackoverflow.com/questions/359424/…
    • 我应该找到这个问题的。这正是我想知道的。
    【解决方案2】:

    使用如下脚本:

    #! /bin/bash
    
    superdir=file:///tmp/superdir
    subdirs=(subdir1 subdir2 subdir3)
    
    for dir in ${subdirs[@]}; do
      echo "Rewriting $dir..."
      git clone --quiet $superdir "$dir" || exit 1
      cd "$dir"
    
      # workaround for git-1.6.4.2 on Cygwin 1.7
      # otherwise, git-filter-branch complains about a dirty branch
      git reset --hard -q
    
      git filter-branch --subdirectory-filter "$dir" HEAD >/dev/null
      git reflog expire --expire=0 --all
      git gc --quiet --prune=0
      cd ..
    done
    

    从一个结构为的 superdir repo 开始

    $ ls -a 。 * .: . .. .git subdir1 subdir2 subdir3 子目录1: . ..文件1 子目录2: . ..文件2 子目录3: . ..文件3

    结果是

    $ ls -a 。 * .: . .. 子目录1 子目录2 子目录3 子目录1: . .. .git 文件 1 子目录2: . .. .git 文件2 子目录3: . .. .git 文件3

    【讨论】:

      【解决方案3】:

      为什么不把每个类都放在它自己的仓库里,把每个作业放在它自己的分支上呢?当我回顾我的大学课程时,这就是我组织事情的方式。

      【讨论】:

      • 这可能更有意义。同样,我的初始配置不是很好。我想知道是否可以以更好的方式重新配置它。
      猜你喜欢
      • 2016-09-22
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2016-07-23
      • 2013-10-06
      • 2012-05-06
      • 1970-01-01
      • 2011-05-28
      相关资源
      最近更新 更多