web-dev-qa-db-ja.com

gitは、コミットする前に、新しいファイルの末尾の空白を削除します

末尾の空白を削除するには、pre-commitフックを使用できます。手動で行うことに興味があります。私はここで質問を読みました:
コミットする前にgitが末尾の空白を自動的に削除するようにする-Stack Overflow
私が欲しいものに最も近い答えは ntc2からの「自動バージョン」

(export VISUAL=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset


このコマンドは、新しいファイルではなく、すでにリポジトリにあるファイルの変更にのみ適用されるように見えることを除いて、うまく機能します。新しいファイルがたくさんあります。つまり、まだリポジトリにありません。これらのファイルから空白を削除したいので、-uの代わりに-Aを追加しようとしましたが、違いはありませんでした。

14
loop

最後の3つのコミットから空白を手動でクリーンアップするには、次のようにします。

git rebase --whitespace=fix HEAD~3

トピックブランチで作業するときは、アップストリームブランチを追跡します(通常はこのように作成します)

git checkout -b topic -t

これにより、git rebaseから最後の引数を削除できます。したがって、完了してマージする準備ができたら、次の方法でトピックブランチ全体をすばやくクリーンアップできます。

git ws#リベースにエイリアス--whitespace = fix

HEAD〜3の例とは異なり、変更された場合、これは実際にはアップストリームブランチに基づいて変更をリベースすることに注意してください。 (しかし、それは私のワークフローでも私が望んでいることです。)

32
Luke Usherwood

基本コミットを手動で指定するか、履歴が線形化されるリベーススタイルのワークフローを使用する必要があるという制限を除いて、私はルークの答えが好きです。追加の引数を必要とせず、コミットグラフのトポロジを変更しない変更を提案します。シェルコマンドとして:

git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})

または〜/ .gitconfigエイリアスとして:

ws = "!git rebase --whitespace=fix --onto $(git merge-base HEAD @{u})"

変更をリベースしたい場合があるので、これを好みますが、マージの競合があると思われる場合は、元の変更と競合の解決の両方が履歴に記録されるように、マージすることを好みます。そうすれば、後で競合の解決を2番目に推測し、必要に応じてやり直すことができます。

私は常にリベースするわけではないので、空白の修正とリベースを混在させたくないです。したがって、ルークの答えに対するこの修正。

さらに、空白エラーで中止するデフォルトのpre-commitフックを有効にします。

cp .git/hooks/pre-commit.sample .git/hooks/pre-commit

これにより、次のワークフローが得られます。これは、何が起こっているのかを理解できるほど手動であるが、邪魔にならないように十分に自動化されているため、気に入っています。

  1. ハックハックハック、空白エラーを導入
  2. コミットしようとする
  3. 事前コミットフックが原因で、コミットが空白エラーで失敗する
  4. git commit --no-verifyとにかくコミットする
  5. git wsエイリアスを使用して修正

--ontoの使用法に関する注意:ここでは必要ありませんが、リベースがこのように機能する方法について推論する方が簡単です。 Lukeのバージョンでは、HEAD~3はmanページの<upstream>ですが、私のバージョンでは、<upstream>はブランチの実際のアップストリームのデフォルト値を保持します。ただし、どちらの方法でも同じ結果になります。

7
jbyler

簡単な修正

引用したコマンド

(export GIT_EDITOR=: && git -c apply.whitespace=fix add -ue .) && git checkout . && git reset

修正したいファイルを最初にgit add -N <files you want to fix>で追加した場合に機能します。 add -Nは基本的に、以前に空のバージョンのファイルをコミットしたふりをするようにGitに指示します。

あなたが得たエラー

fatal: Empty patch. Aborted.add -Aeエラーが発生する理由はわかりませんが、単純なgit add -A . && git diff --cachedを実行すると、パッチが実際には空であってはならないことが示されるため、バグのように見えます。

より良い空白修正

私は最近更新しました あなたがリンクした私の答え 空白を修正するためのより良いGitエイリアスで。 ルークのリベーストリック と冗長性の少ない制御フローを使用して、そのエイリアスを書き直します。

fixws =!"\
  if (! git diff-index --quiet --cached HEAD); then \
    \
    git diff-files --quiet `git rev-parse --show-toplevel` ; \
    export NEED_TO_STASH=$? ; \
    \
    git commit -m FIXWS_SAVE_INDEX && \
    if [ 1 = $NEED_TO_STASH ] ; then git stash save FIXWS_SAVE_TREE; fi && \
    git rebase --whitespace=fix HEAD~ && \
    git reset --soft HEAD~ && \
    if [ 1 = $NEED_TO_STASH ] ; then git stash pop; fi ; \
  fi"

これにより、インデックスを保持し、ツリーをそのままにして、インデックスの空白を修正します。このエイリアスを使用すると、リポジトリ内のバージョン管理されていないファイルを次のように修正できます。

git add --all :/ && git fixws && git reset

ただし、作業中のコミットで空白を修正するという、より一般的なケースも処理します。インデックスやツリーがクリーンな場合でも機能するため、複雑です。

2
ntc2