[解決済み] git-mergeで行末の差分を無視することは可能ですか?
質問
は可能でしょうか?
git merge
は、行末の違いを無視するのですか?
間違った質問かもしれない・・・が。
を使用してみました。
config.crlf input
を適用したところ、ちょっとごちゃごちゃして制御不能になりました。
事後
.
ひとつには、この設定を後から適用しても、このオプションを適用する前にリポジトリにコミットされたファイルには影響がないように見えるということです。もうひとつは、突然すべてのコミットで、CRLF が LF に変換されるという迷惑な警告メッセージが大量に発生するようになったことです。
正直なところ、私はどのような改行方式を採用しても構わないのですが、個人的にはUnixスタイルの
\n
でも、何でもいいんです。私が気にするのは
git merge
がもう少し賢くなり、行末の違いを無視できるようになりました。
時々、同じファイルが2つあるのですが、gitはそれらを衝突しているとマークしてしまいます(そして、衝突しているのは 全体 ファイル) は、単に異なる行末文字を使用しているというだけの理由です。
更新してください。
ということがわかりました。
git diff
は
--ignore-space-at-eol
オプションを使用できるようにすることは可能でしょうか?
git merge
はこのオプションも使用できますか?
解決方法は?
2013年にアップデートしました。
最近の git のバージョンでは、merge with strategy を使ってオーソライズしています。
recursive
と戦略
オプション
(
-X
):
-
を"から。
Gitマージと2つのブランチでのスペースとタブの混在の修正
"。
git merge -s recursive -Xignore-space-at-eol
しかし、"を使用すると
-Xignore-space-change
"です。
も可能です。
jakub.g また コメント その の戦略はチェリーピックでも有効です。 :
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
よりもはるかに効果的です。
ignore-all-space
.
Git 2.29 (2020 年第 4 四半期) より前のバージョンでは、内部的に merge-recursive マシンを使用するすべての "mergy" 操作は、以下のように尊重されるべきです。
merge.renormalize
という設定がありますが、多くはそうではありませんでした。
参照
コミット 00906d6
,
コミット 8d55225
,
コミット 6f6e7cf
,
コミット fe48efb
(2020年08月03日) によるものです。
イライジャ・ニューレン(
newren
)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 4339259
, 2020年8月10日)
merge
: 作る
merge.renormalize
マージマシンのすべての用途で動作する
サインオフバイ:イライジャ・ニューレン
<ブロッククオート
は、'
merge
' コマンドはマージを行う唯一のコマンドではありません。
checkout -m
やrebaseも同様です。
残念ながら、コードの中で唯一 " をチェックした部分です。
merge.renormalize
コンフィグ設定は
builtin/merge.c
によって実行されたマージにのみ影響することを意味します。
merge
コマンドを使用します。
このコンフィグ設定の取り扱いを
merge_recursive_config()
他のコマンドも同様に恩恵を受けることができるように。
当初の回答(2009年5月)
eol styleを無視するためのパッチは、以下のページで提案されています。
2007年6月
しかし、それは
git diff --ignore-space-at-eol
ではなく
git merge
.
その際、質問されたことがあります。
すべき
--ignore-space-at-eol
のオプションになります。git-merge
?
この機能が重要なのは、マージです。
これらのオプションを有効にして自動解決されたマージのセマンティクスはどのようなものでしょうか。リネーム検出のみに使用されるのでしょうか、それとも、例えば、空白の変更のみによるコンフリクトにはフラグを立てないのでしょうか。また、そうしない場合、どのバージョンを自動的に受け入れるのでしょうか?
ジュリオ・C・ハマノはあまり乗り気ではありませんでした。
確かにこれは魅力的ですが、それは後回しにしたほうがいいのではないでしょうか。
機械的に処理される差分(例えば "git-merge-recursive" でマージに使用し、"git-recursive; で適用)と、2種類の異なる差分という概念を導入することになるのではないでしょうか。 "git-am")、そしてもうひとつは人間が検査して理解するためのものです。
後者の場合、入力ファイルを結合して比較すると、機械的な用途には使えないかもしれないが、結合しておくと便利な場合が多い。
に関しては、一般的な考え方として
git merge
は、サードパーティのマージツールに依存することです。
例えば、私が設定した DiffMerge を Git マージ用のツールに設定する。 ルールセット これは、マージツールが特定のタイプのファイルに対してeolを無視することを許可するものです。
Windows 上で、MSysGit1.6.3、DOS または Git bash セッション、DiffMerge または KDiff3 でセットアップしてください。
-
をPATHに設定する(ここでは。
c:\HOMEWARE\cmd
). - そのディレクトリに merge.sh スクリプト (お好みのマージツールのラッパー) を追加します。
merge.shです。
#!/bin/sh
# Passing the following parameters to mergetool:
# local base remote merge_result
alocal=$1
base=$2
remote=$3
result=$4
if [ -f $base ]
then
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$base" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# for merge respecting eol, KDiff3 is better than DiffMerge (which will always convert LF into CRLF)
# KDiff3 will display eol choices (if Windows: CRLF, if Unix LF)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$alocal" "$remote" -o "$result"
else
#there is not always a common ancestor: DiffMerge needing 3 files, BASE will be the result
#"C:/Program Files/SourceGear/DiffMerge/DiffMerge.exe" "$alocal" "$result" "$remote" -m --result="$result" --title1="Mine" --title2="Merging to: $result" --title3="Theirs"
# KDiff3 however does know how to merge based on 2 files (not just 3)
"C:/Program Files/KDiff3/kdiff3.exe" -m "$base" "$remote" -o "$result"
fi
- Git 用のマージラッパーを宣言する
Gitの設定コマンドです。
git config --global merge.tool diffmerge
git config --global mergetool.diffmerge.cmd "merge.sh \"$PWD/$LOCAL\" \"$PWD/$BASE\" \"$PWD/$REMOTE\" \"$PWD/$MERGED\"
git config --global mergetool.diffmerge.trustExitCode false
git config --global mergetool.diffmerge.keepBackup false
- autoCRLFがfalseであることを確認する
システムレベルでのgit config。
git config ---system core.autoCRLF=false
- 2 つの行が同一である場合(ただし eol 文字)、DiffMerge と KDiff3 の両方がマージ中にそれらの行を無視することをテストします。
DOSスクリプト(注 dos2unix コマンドはここから来ています Unixのeol-styleをシミュレートするために使用されます。このコマンドは、この回答の冒頭で述べたディレクトリにコピーされています)。
C:\HOMEWARE\git\test>mkdir test_merge
C:\HOMEWARE\git\test>cd test_merge
C:\HOMEWARE\git\test\test_merge>git init
C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout -b windows
Switched to a new branch 'windows'
C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style"
C:\HOMEWARE\git\test\test_merge>git checkout master
C:\HOMEWARE\git\test\test_merge>git checkout -b unix
Switched to a new branch 'unix'
C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt
C:\HOMEWARE\git\test\test_merge>dos2unix a.txt
Dos2Unix: Processing file a.txt ...
C:\HOMEWARE\git\test\test_merge>git add a.txt
C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style"
[unix c433a63] add 3 lines, all file unix eol style
C:\HOMEWARE\git\test\test_merge>git merge windows
Auto-merging a.txt
CONFLICT (content): Merge conflict in a.txt
Automatic merge failed; fix conflicts and then commit the result.
C:\HOMEWARE\git\test\test_merge>git ls-files -u
100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt
100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt
100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt
C:\HOMEWARE\git\test\test_merge>git mergetool
Merging the files: a.txt
Normal merge conflict for 'a.txt':
{local}: modified
{remote}: modified
Hit return to start merge resolution tool (diffmerge):
この時点で ("return" を押す)、DiffMerge または KDiff3 が開かれ、どの行が実際にマージされ、どの行が無視されるかを自分で確認することができます。
警告
: DiffMerge を使用すると、結果ファイルが常に Windows eol モード (CRLF) になります...
KDiff3では、何らかの方法で保存することを提案しています。
関連
-
[解決済み】git push >> fatal: 設定されたプッシュ先がありません。
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push s...
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] まだプッシュされていない Git マージを元に戻す
-
[解決済み] Git にファイルモード (chmod) の変更を無視させるには?
-
[解決済み] Gitでファイルの変更を追跡しない、無視する方法とは?
-
[解決済み] 2 つの Git リポジトリをマージする方法は?
-
[解決済み] 改行設定の変更方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git:コミットに何も追加されていないが、未追跡のファイルが存在する
-
[解決済み】gitがローカルバージョンをリモートバージョンに置き換える
-
[解決済み】git revert <hash> not allowed due to a merge but no -m option was given.
-
[解決済み】マージ後のコミットでGitエラー - fatal: マージ中に部分コミットができない
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
git commits with an error: 更新が拒否されました。現在のブランチの先端が、このブランチより後ろにあるためです。
-
git commit リモートエラー [rejected] master -> master (フェッチファースト)
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] 警告: リモート HEAD は存在しない参照元を参照しているため、チェックアウトできません。
-
[解決済み] git rebase: "error: cannot stat 'file': パーミッションが拒否されました"