4

我在一家公司工作,其中一个团队在每次提交时不断包含生成的可执行文件(和一堆其他垃圾)。由于非技术原因,我不得不不断地在他们的基础上重新调整我们的工作。

这就是我大多数时候的样子:

   -----C------TNC--(their_branch)
         \
          \----CC--(master)

TNC(他们的新提交)包含:

  • 一些有用的变化
  • 很多垃圾

CC(清理提交)包含:

  • 添加了 .gitignore
  • rm 很多垃圾-*

现在,我想做:

 (on master)$ git rebase their_branch

当然,这会引发冲突(更改、删除)。由于这几乎是日常任务,我想不慌不忙地完成它(这足以重新定义我们的整个历史)。所以我尝试了:

 (on master)$ git rebase their_branch -s recursive -X ours

根据Git 手册,这应该强制“通过支持我们的版本来干净地自动解决冲突的块。来自另一棵树的不与我们冲突的更改将反映到合并结果中。对于二进制文件,整个内容被从我们这边带走。” 但它没有 - 它仍然停止并要求我解决冲突。我一直在运行一个删除文件的脚本,但这很烦人。

Git可以强制删除二进制文件吗?

4

1 回答 1

0

对于您非常具体的情况,例如支持所有更改,包括在您的分支上删除文件,您可以按照以下方式进行操作。一般来说,尽管总是手动解决变基更好。

# attempt a rebase, expect it to fail
$ git rebase their_branch

# take our side of all files that changed on their_branch and master branch,
# expect resolution to fail for renames (renames include file deletions) still;
# also note the meaning of `theirs` and ‘ours’ is reversed for a rebase.
$ git checkout --theirs -- .

# tell git that conflicts have been resolved (after we took our side)
$ git add -A

# explicitly take our side of all deletes
$ git diff --name-only --diff-filter=UD | xargs -n1 git rm

# proceed to rebase our changes, expect this to succeed
$ git rebase –continue && echo “SUCCESS!”

所有这些都可以安排在一个命令、别名或 shell 函数中:

$ git rebase their_branch || ((git checkout --theirs -- . \
|| (git diff --name-only --diff-filter=UD | xargs -n1 git rm) && git add -A) \
&& git rebase --continue)

如果你的 rebase 碰巧成功了,||将会避免多余的脚本解析,在你的 rebase 成功的第一个状态停止,视情况而定。

这是一个启动的玩具示例,用于说明文件删除的变基,

# their_branch = master, our dev branch = foo
$ cd /tmp/toy-repo
$ git init . && touch README && git add README && git commit -m "add README"
$ git checkout -b foo && git rm README && git commit -m "rm README"
$ git checkout master && echo "changing README" >> README && git add README && git commit -m "modify README"
$ git checkout foo && git rebase master || ((git checkout --theirs -- . || (git diff --name-only --diff-filter=UD | xargs -n1 git rm) && git add -A) && git rebase --continue)
$ git log
a3730c5 rm README // on foo, rebased
55c9074 modify README // on master
1fa1398 add README // on master
于 2014-01-06T08:16:38.293 回答