移动.git目录

时间:2010-06-30 19:10:13

标签: git dvcs

我有一个我在项目学习曲线的早期创建的存储库。我已经了解了更多,我意识到这会产生问题,因为我想要跟踪的一些文件在编译的源代码中不是必需的。我想要做的是创建一个新的“项目”父目录,将现有的源目录移动到该父目录,并将不需要编译的文件迁移到该父目录。

git可以吗?我是否会完全销毁所有引用,因为我还要将.git/目录移动到父级别?

感谢。

2 个答案:

答案 0 :(得分:3)

一种选择就是在当前存储库中移动。

例如,假设类似:

/.git
/lib/lib.c
/lib/lib.h
/test.c
/readme.txt

您可以创建一个新文件夹(下面的src)并将lib文件夹和test.c文件夹移动到新文件夹中(使用git mv)。然后当前目录将是您想要的“项目”父目录,并且所有代码都将位于新文件夹中。

/.git
/src/lib/lib.c
/src/lib/lib.h
/src/test.c
/readme.txt

另一种选择是git filter-branch,正如VonC在评论中指出的那样。使用它我相信你可以构建一个没有提交移动的重组存储库,文件将始终存在于新结构中。

答案 1 :(得分:1)

与Chris Shaffer达成协议,您可以使用以下脚本来完成这些步骤:

fullpath=`pwd`
dirname=`basename $fullpath`

if [ ! -d ./.git ]; then
  echo 'Working directory contains no .git repository. There is nothing to move.'
elif [ -d ../.git ]; then
  echo 'Parent directory already contains a .git repository. Aborting.'
elif [ -d $dirname ]; then
  echo "There's already a $dirname directory. Aborting to be safe."

else  # Enough checking; let's get some work done...

  mkdir $dirname
  shopt -s extglob
  for file in `ls -a | egrep -v [.]git\|^[.]+\$\|^$dirname\$`; do
    git mv $file $dirname/
  done
  mv .git* ..
  mv $dirname/* .
  mv html/.[a-z]* .
  git commit -m "Moved Git repository up one directory"
  rmdir $dirname

fi

这可能比一次性情况需要更多的检查,但它应该完成这项工作。您可以手动调整它,或将其保存为可执行脚本,然后从包含.git的目录中调用它。

显然其他人只能mv .git ..,但这对我不起作用。我必须首先执行所有git mv file操作,然后将所有操作都移到一起。

如果我将来更加强大,我会在https://github.com/jcamenisch/dotfiles/blob/master/bin/mv-git-up发布更新。