我将我的svn存储库迁移到git,但由于某种原因,仍然存在trunk文件夹,但情况并非如此。我想在不损坏历史记录行的情况下删除这些文件夹。
这是我目前的git存储库:
- My repository
-- Project1
--- trunk
---- src
---- somefile.txt
---- someotherfile.cpp
---- andanotherfile.cpp
这就是我想要的:
- My repository
-- Project1
--- src
--- somefile.txt
--- someotherfile.cpp
--- andanotherfile.cpp
我知道命令filter-branch用于此,但除了this和this之外我找不到适合我的情况的例子,但是即便如此我感到有点困惑,不知道我是否应该尝试。任何人遇到类似的东西,可以确认那些是解决方案吗?
提前致谢。
更新:所以我知道大部分时间都使用以下命令来执行契约:
git filter-branch --index-filter \
'git ls-files -s | sed "s-/trunk/-/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' HEAD
实际上,我检查了sed行,它确实告诉我它将删除主干并移动内部的任何内容到上层目录。但是,执行给出了错误:
../myrepository/.git-rewrite/t/../index.new': No such file or directory
我不知道为什么会收到此错误。我查了一下,似乎我需要在HEAD
之前加上这个命令,就像83df928c..HEAD
一样。但是,我不知道这是为了什么(我的意思是,版本号,很可能,但为什么?)或者我的是什么。很感激帮助。几乎得到了它!
答案 0 :(得分:0)
克隆另一个仓库以进行测试
git filter-branch --tree-filter 'cd Project1;cp trunk/* ./; rm -rf trunk'
答案 1 :(得分:0)
所以,就在这里。
执行魔术的命令是:
git filter-branch -f --index-filter \
'git ls-files -s | sed "s-/trunk/-/-" |
GIT_INDEX_FILE=$GIT_INDEX_FILE.new \
git update-index --index-info &&
mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"' af117ec86a30ba6676571cd1f73083c5cfbec0bd..HEAD
请注意..HEAD
之前的提交标记,该标记应该是您应输入的第二个或第三个最早的提交标记。如果输入第一个,则会出错。
要找出最早提交的提交标记,只需使用:
git log
并尽可能向下滚动,在那里你会看到最早的提交。拿第二或第三。已经完成了。