如何在目录树中将我的git repo向下移动?

时间:2011-01-11 16:41:52

标签: c# git

我目前正在使用Visual Studio在C#中编写应用程序。因此,VS2010创建了一个包含项目目录的Solution目录。 所以我的层次结构是这样的:

Solution  
  .git
  project1
  project2

我想做的就是这样:

Solution
  Project 1
    .git
  Project 2

到目前为止,除了项目2之外,还会跟踪解决方案中的文件(例如project.sln之类的内容)。 有没有办法在不重写历史的情况下做到这一点?

提前致谢。

4 个答案:

答案 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