我目前正在使用Visual Studio在C#中编写应用程序。因此,VS2010创建了一个包含项目目录的Solution目录。 所以我的层次结构是这样的:
Solution
.git
project1
project2
我想做的就是这样:
Solution
Project 1
.git
Project 2
到目前为止,除了项目2之外,还会跟踪解决方案中的文件(例如project.sln之类的内容)。 有没有办法在不重写历史的情况下做到这一点?
提前致谢。
答案 0 :(得分:3)
这实际上是由SethRobinson在#git@freenode.net上发表的,但这是他的解决方案:
第一步,将整个git树移动到子目录中:
mkdir .solution;
mv Solution .solution/Project1;
mv .solution Solution;
mkdir Solution/Project2
第二步,告诉git将子目录提升到root:
cd Project1;
mkdir .foo;
mv * .foo;
cd .foo;
mv Project1/* ..;
cd ..;
rm -rf .foo;
git add -A .;
git commit -a -m "Promoted Project1 to root"
答案 1 :(得分:1)
如果我理解正确,您的存储库中的跟踪文件当前包含文件和目录,所有这些都在“project1”子目录中。由于所有内容都在project1子目录中,因此您基本上只想在那里启动存储库。这是对的吗?
如果这是真的,那么如果没有(1)重写项目历史记录(git filter-branch
可以帮助你),或者(2)通过添加移动所有文件的提交来添加历史记录,则不能这样做。
基本上,您无法在不更改提交ID的情况下追溯更改内容;这是git的一个特性。但您的情况 可以解决。请告诉我们您更喜欢哪个选项,我们很乐意为您提供帮助。
答案 2 :(得分:0)
如果没有跟踪项目2,我认为你只能将它移动到你想要的地方。 git跟踪与树结构分开的内容更改,因此它会看到文件只是移动,但没有内容更改。
答案 3 :(得分:0)
git filter-branch --subdirectory-filter Project\ 1 HEAD
这确实调整了历史。
我测试它是这样的:
root/
.git
folder/
index
git filter-branch --subdirectory-filter folder HEAD
得到了:
root/
.git
index