2016-09-06 16 views
1

意向:によりレガシーコードのヒープに、私は環境が徐々に改善するために私のプル要求に追加または変更行だけをlintのたいと思います。gitコミットの範囲から追加され更新された行番号のリストを取得するには?

入力:ベースブランチの名(master)、私のPRのブランチの名前(例えばhonzajavorek/my-cool-feature)、最後のハッシュ(例えば53253a3e8d9b1e3ed7d45b91e045c59d50aefdf0)機能ブランチにコミットします。

出力:影響を受ける(追加または変更された、明らかに削除されていない)行番号が各ファイルに含まれているため、それらを含むようにlinter出力をフィルタリングできます。私は1つのライナーを探していないよ

、私は短いbashのを書くといいよ/ Pythonの/だけの合理的な複雑性(複数の行)と、これを行うためのスクリプトをNode.jsの。


更新日:ただ見つけたGit diff with line numbers (Git log with line numbers)。実際には簡単な作業ではありません:(

答えて

1

私はあなたが欲しいものを生み出すのbashで素朴なコードを思い付くことができました。

ここnaivityがあることは、これはマスター機能ブランチ間のクリーン(リニア)の歴史を必要とするという事実にあります実際にはそうではありません。実際には、この例ではmasterの代わりにこのブランチを流用したmasterのcommitのハッシュを使用するか、これを試みる前にブランチをrebaseしてください。

また、それが唯一のクリーンな作業ディレクトリでテストされた、機能ブランチはcheckouted。

for COMMIT in $(git log --pretty=format:%h master...feature); do 
    for FILE in $(git ls-tree -r feature --name-only); do 
    for NUMBER in $(git blame --line-porcelain "$FILE" | egrep ^$COMMIT | cut -d' ' -f3); do 
     echo "$FILE":$NUMBER 
    done 
    done 
done 

最初のループは、masterとfeatureブランチの間のすべてのコミットを処理します。

第二のループは、すべての機能ブランチ内のファイルを追跡歩きます。

そして第三の(最も内側の)ループはそのコンテキスト内に設けられたコミットハッシュによって非難されているすべての行を見つけます。最後に

、次のような出力が得られます。

points.yml:32 
points.yml:33 
points.yml:34 
points.yml:37 
site.py:12 

フォーマットが明らかです。

+1

私はそれがあまりにもループしていると思います - 最も外側のループは分割され、egrepのために1つの正規表現を生成することができます – MacHala

+0

'git diff -name-only master..feature'と' git blame -b master..feature'と同様の方法で、より堅牢なソリューションを提供します。 –

関連する問題