我有一个我在项目学习曲线的早期创建的存储库。我已经了解了更多,我意识到这会产生问题,因为我想要跟踪的一些文件在编译的源代码中不是必需的。我想要做的是创建一个新的“项目”父目录,将现有的源目录移动到该父目录,并将不需要编译的文件迁移到该父目录。
git可以吗?我是否会完全销毁所有引用,因为我还要将.git/
目录移动到父级别?
感谢。
答案 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发布更新。