7

次のユースケースを検討してください。

メインブランチでリファクタリングが行われている間、ローカルブランチで作業しています。現在、一部のファイル (クラス) の名前が変更されているか、新しい場所に移動されています。マージすると、欠落しているクラスが原因で大量のインポート エラーが発生します。

--A--B--C--D--E-- (master)
   \           \
    F--G--H--I--J  (topic)

A使用した古い名前がありますF--G--H--I

のファイルがリファクタリングされ、B--C--D--E新しいファイル名がE. これには、次のような連鎖的な名前変更が含まれます

   B: path/to/File.java              
-> C: path/to/BetterName.java
-> D: better/package/BetterName.java 
-> E: final/package/FinalName.java

J私のブランチにリファクタリングがないため、マージすると多くの(コンパイル)エラーが発生します。(私はまだpath.to.File代わりに参照しているためfinal.package.FinalName

壊れたビルドを修正するには、古いクラスの新しい名前を知る必要があります。

特定のファイルに適用されたすべての名前変更を取得する git コマンドはありますか?

4

2 に答える 2

1

Git はファイルの名前変更を検出する必要があります。ただし、ファイルの 50% 以上の行が変更されている場合は、名前変更とは見なされなくなります。必要に応じて、このしきい値を変更できます。

これを行うコマンドは次のとおりです。

git log -M --diff-filter=R --stat

名前の変更のみが表示されます。しきい値をデフォルトの 50% 以外に変更したい場合は、数値を M オプションに追加するだけです。

git log -M90 --diff-filter=R --stat

内容が 10% 以上変更されていない場合にのみ、ファイルの名前が変更されたと見なされます。

アップデート:

中間ステップをすべてスキップするには、代わりに diff を使用します。Git は名前の変更に従います。

git diff -M --diff-filter=R --name-status ..master | cut -f2-

トピックブランチにいるとき。

次に、これをパイプして、参照を調整するための一連の sed 命令を作成できます。

于 2012-04-17T15:52:56.607 に答える
-1

ウェブ上で満足のいく答えを見つけることができなかったので、ログを 1 つずつ確認する (厄介な) スクリプトを作成しました (名前を変更して名前を変更する)。

上記の例でスクリプトを使用すると、次の出力が得られます。

$ git history path/to/File.java

final/package/FinalName.java

スクリプトを自分に追加し、グローバル git config~.bashrcにオプションを追加しましたalias.history=!bash -ic 'git_file_history "$@"' -

#! /bin/sh
### Takes a filename as parameter ($1)
### Echoes all filenames related to $1
function git_file_history() {
        loc_var=$1;
        old=""
        while [ "$loc_var" != "$old"  ] && [ "$loc_var" != "" ]
        do
                old=$loc_var;
                #echo $loc_var;
                hashes=$(git log --format="%P %H" -1 --follow --  $loc_var);
                status=$(git diff --name-status --find-renames $hashes | grep $loc_var);
                awks=`echo $status | awk '{print $3}'`
                loc_var=$awks;
        done 
        echo "$loc_var";
}
于 2012-06-26T08:12:43.190 に答える