使git存储库的子目录成为他们自己的git存储库

时间:2009-12-30 03:45:27

标签: git

  

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

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

我有一个git仓库,每个分配都有一个子目录。我想知道是否有一种理智的方法可以使每个子目录成为自己的git仓库,保留与这些文件相关的历史记录。似乎“git filter-branch --subirectory-filter”是答案的一部分,但我不知道该怎么做。

修改

澄清:我的结构是这样的

superdir  
  .git  
  subdir1
  subdir2
  subdir3

我希望我的结构更像这样

superdir    
  subdir1
    .git
  subdir2
    .git
  subdir3
    .git

我可以这样做吗?

3 个答案:

答案 0 :(得分:2)

您可能正在寻找git submodules,但我只是更改您的布局,使顶级成为git repo,并且只需单独管理子目录。< / p>

答案 1 :(得分: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

subdir1:
.  ..  file1

subdir2:
.  ..  file2

subdir3:
.  ..  file3

结果是

$ ls -a . *
.:
.  ..  subdir1 subdir2  subdir3

subdir1:
.  ..  .git  file1

subdir2:
.  ..  .git  file2

subdir3:
.  ..  .git  file3

答案 2 :(得分:1)

为什么不将每个类放在它自己的repo中,并将每个赋值放在它自己的分支上?回顾我的大学课程,这就是我组织事情的方式。

相关问题