混帐与重命名的文件

我有一个大的网站,我正在进入一个新的框架,在这个过程中添加git。 当前网站没有任何版本控制。

我开始复制该网站到一个新的git存储库。 我做了一个新的分支,并且做了所有必要的改变,使它能够与新的框架一起工作。 其中一个步骤是更改所有页面的文件扩展名。

现在在我一直在新网站上工作的时候,对旧网站上的文件进行了更改。 所以我切换到掌握并复制了所有这些变化。

问题是,当我将分支与新的框架合并到主分支上时,每个在主分支上更改的文件都有冲突。

我不会担心,但有几百个文件的变化。 我已经尝试了git rebasegit rebase --merge合并没有运气。

如何合并这两个分支而不处理每个文件?

从git 1.7.4开始,你可以指定合并的重命名阈值为git merge -X rename-threshold=25 ,以便控制25%的相似度已经足够考虑两个文件重命名候选。 这个,根据情况加上-X ignore-space-change可能会使重命名检测更可靠。

然而,我想要更直接的控制,并在最后几天做了一个相关的剧本。 也许它有帮助 – 让我知道。

https://gist.github.com/894374

应该有自动工作,感谢重新检测。 下面是示例会话:

 $ git inittesting
在/tmp/jnareb/test/.git/中初始化了空的Git仓库
 $ cp〜/ git / README。  #示例文件,足够大,以便重命名检测工作
 $ git add。
 $ git commit -m'初始提交'
 [master(root-commit)b638320]初始提交
  1个文件已更改,54个插入(+),0个删除( - )
 创build模式100644自述文件
 $ git checkout -b新function        
切换到一个新的分支“新function”
 $ git mv README README.txt
 $ git commit -m'将README重命名为README.txt'
 [新functionce7b731]将README重命名为README.txt
  1个文件已更改,0个插入(+),0个删除( - )
 重命名README => README.txt(100%)
 $ git checkout master
切换到分支“主”
 $ sed -e's / UNIX / Unix / g'README + && mv -f README + README
 $ git commit -a -m'README changed'
 [master 57b1114] README已更改
  1个文件已更改,1个插入(+),1个删除( - )
 $ git merge new-feature 
通过recursion进行合并。
  README => README.txt |  0
  1个文件已更改,0个插入(+),0个删除( - )
 重命名README => README.txt(100%)

如果你在“新特性”分支上做“git merge master”,而不是像上面那样在master上“git merge new-feature”,你会得到:

 $ git merge master
通过recursion进行合并。
  README.txt |  2 +  - 
  1个文件已更改,1个插入(+),1个删除( - )

你能告诉你在做什么不同吗?

请注意,普通的“git rebase”(和“git pull –rebase”)不会重命名:您需要运行“git rebase -m”或者交互式rebase。

我find了一个解决办法。 由于文件的重命名是由脚本完成的,我可以复制新的.php文件,并在合并之前重新运行脚本。 由于文件具有相同的名称,所以合并的工作没有冲突。

以下是整个过程的步骤。

  1. 创buildgit repo git init
  2. 复制中的现有文件
  3. 承诺
  4. 运行脚本来重命名文件
  5. 承诺
  6. 创build一个分支,但不检查出来
  7. 随时修正修改
  8. 检查你在步骤6中创build的分支
  9. 复制文件的新版本
  10. 运行脚本来重命名文件(这应该replace第一次运行的文件)
  11. 承诺
  12. 结帐大师
  13. 将分支合并到主

这是因为git使用新名称对文件进行了更改。

在我的情况下,重命名检测失败,我发现在合并解决scheme,我可以做到以下几点:

鉴于:

 fileA: A modified file that was moved to the new place but is currently in the old place. destB: The location where fileB was moved to. This could include a new filename. 

运行这些命令:

 git add fileA git mv fileA destB 

这就是我所要做的。 然后我承诺继续进行重组。

添加到@ Tilman的答案,与最近的git重命名选项是-X find-renames=<n>