84

1 つのブランチ ( refactoringBranch) では、完全なディレクトリの再構築が行われました。ファイルは無秩序に移動されましたが、コンテンツは保持されていました。

私はマージしようとしました: git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change refactoringBranch

git status は、約半分のファイルの名前変更の認識を示しています。しかし、プロジェクトの半分の 10000 ファイルのうち、移動されたと認識されませんでした。

一例は次のとおりです。

# On branch master
# Changes to be committed:

#   deleted:    404.php
#   new file:   public_html/404.php
    ...
#   deleted:    AnotherFile.php
#   new file:   public_html/AnotherFile.php
    ...
#   renamed:    contracts/css/view.css -> public_html/contracts/css/view.css

提案?


先史時代

リファクタリングは git の外で行われました。私は次のことをしました:

  1. refactoringBranchで発信元を作成しましたmaster
  2. 変更された構造を 内にドロップしましたrefactoringBranch。つまり、他のディレクトリに変更があり、git リポジトリにコピーして貼り付けただけです。
  3. すべてを追加してコミットし、マージしようとしました。

これは私のワークフローでした:

git checkout -b refactoringBranch
cp -R other/place/* ./
git add . -A
git commit -a -m "blabla"
git checkout master
git merge --no-ff -Xrename-threshold=15 -Xpatience -Xignore-space-change refactoringBranch

問題はgit add . -Aおそらくステップで発生します。名前の変更の検出が正しければ、マージは問題なく行われると思います。

4

6 に答える 6

104

OS X は大文字と小文字を区別しますが、区別しません。Git では大文字と小文字が区別されます。ファイル名を変更し、唯一の変更が大文字と小文字の変更であった場合は、ファイルの名前を元の名前に戻してから、git mv代わりに を使用して名前を変更します。

于 2016-05-26T20:09:00.310 に答える
52

名前変更の検出:

私の推測では、候補の数が非常に多いため、名前変更の検出が失敗していると思われます。git のソース コードは、ところどころわかりにくいところがありますが、名前変更検出アルゴリズム (「参考文献」を参照diffcore-rename.c) の特定の検索ステップで使用されるいくつかのハードコーディングされた制限と、確認するペア (構成キーdiff.renameLimitmerge.renameLimit)。これにより、構成された制限を適切に高く設定した場合でも、検出が失敗する可能性があります。構成可能な制限自体は、[1, 32767] の範囲に固定されています。

おそらく、最初に再構築の手順を実行することでこれを回避できます: コンテンツを変更せずに git mv でファイルを移動し、新しいレイアウトに一致させ、それを新しいブランチにコミットし、それを最終バージョンに置き換えます。コンテンツは変更され、名前は変更されません。内容が変更されていない名前の変更は、より確実に検出される可能性があります。これは、実行した再構築がかなり単純な場合にのみ実用的であり、名前変更検出の失敗が解決されるかどうかはわかりません。

あるいは、単純なファイル グループを使用して変更を個別のコミットに分割し、各コミットで名前変更検出の候補が少なくなるようにすることもできます。

マージ:

残念ながら、新しいブランチを master の上に置くことで、マージに関する誤った情報を git に与えることになります。名前の変更が正しく検出されるかどうかに関係なく、新しく作成されたブランチが master とマージされると、master のすべてが上書きされます。git の観点からは、新しいブランチにまだ含まれていない master の変更はないからです。 .

于 2012-12-10T20:30:56.743 に答える
33

の代わりにgit status、試してみると、名前のgit commit --dry-run -a変更がより適切に検出されます。

于 2014-07-12T14:15:15.987 に答える
-1

ファイルの名前を変更/移動する必要があり、それについてGITに明示的に伝えるのを忘れたときはいつでも、私は使用しました

git add . -A

移動されたファイルを自動検出する

于 2012-12-10T17:40:06.277 に答える