どうやって作るの
git status
行末の違いを無視しますか?
背景情報:
私はランダムにWindowsとLinuxを使用してプロジェクトに取り組んでいます。プロジェクトはDropboxにあります。
Git diffで行末を無視する方法について多くのことを見つけました。 meldを使用しているため、git diffは各ファイルのmeldを開きます。そして、meldは「同一ファイル」と言います。
それで、どうすればこれを回避できますか。 Gitは、変更されたファイルのmeldのみを開く必要があります。また、ファイルの末尾のみが異なる場合、gitステータスは変更されたファイルを報告すべきではありません。
編集:原因:
これは、Windowsでのこの設定が原因で発生しました
core.autocrlf true
そこで、Linuxで作業コピーをチェックアウトし、Windowsでcore.autocrlfをfalseに設定しました。
Gitステータスに別の新しい行を無視させる方法を知っているのはまだいいでしょう。
次のようにcore.autocrlf値を設定してみてください。
git config --global core.autocrlf true
代わりに、次の設定で.gitattributesを使用します。
# Ignore all differences in line endings
* -crlf
.gitattributesは、グローバル.gitconfigと同じディレクトリにあります。 .gitattributesが存在しない場合は、そのディレクトリに追加します。 .gitattributesを追加/変更した後、既存のファイルに変更を正常に適用するには、リポジトリのハードリセットを行う必要があります。
問題 Windowsオペレーティングシステムのgitコマンドに関連:
$ git add --all
警告:LFは...でCRLFに置き換えられます.
ファイルには、作業ディレクトリに元の行末があります。
解像度:
$ git config --global core.autocrlf false
$ git add --all
警告メッセージは表示されません。
OPはマルチOSソリューションの必要性に言及しているため、この回答は関連しているようです。このGithub ヘルプ記事 OS間の行末を処理するための利用可能なアプローチの詳細。クロスOSラインエンドを管理するには、グローバルおよびレポごとのアプローチがあります。
グローバルアプローチ
LinuxまたはOS XでGitの行末処理を構成します。
git config --global core.autocrlf input
WindowsでGitの行末処理を構成します。
git config --global core.autocrlf true
レポごとのアプローチ:
リポジトリのルートで、.gitattributes
ファイルを作成し、プロジェクトファイルの行末設定を次の形式で一度に1行ずつ定義します。path_regex line-ending-settings
ここで、line-ending-settings
は以下:
text
値をさらに構成して、一致するファイルの行末を処理する方法をGitに指示できます。
text
-行末をOSネイティブの行末に変更します。text eol=crlf
-チェックアウト時に行末をCRLF
に変換します。text eol=lf
-チェックアウト時に行末をLF
に変換します。text=auto
-行ハンドルをGitの裁量に任せる賢明なデフォルト。サンプルの.gitattributesファイルの内容は次のとおりです。
# Set the default behavior for all files.
* text=auto
# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text
# Convert to CRLF line endings on checkout.
*.sln text eol=crlf
# Convert to LF line endings on checkout.
*.sh text eol=lf
# Binary files.
*.png binary
*.jpg binary
行末の設定を変更した後にレポジトリを更新する方法の詳細 here 。 Tldr:
gitを使用してファイルをバックアップし、リポジトリ内のすべてのファイル(.gitディレクトリを除く)を削除してから、ファイルを一度に復元します。現在のファイルをGitに保存して、作業内容が失われないようにします。
git add . -u
git commit -m "Saving files before refreshing line endings"
インデックスを削除し、Gitに作業ディレクトリを再スキャンさせます。
rm .git/index
Gitインデックスを書き換えて、すべての新しい行末を取得します。
git reset
書き換えられた正規化されたファイルを表示します。
場合によっては、これだけで十分です。他の人は、次の追加手順を完了する必要がある場合があります。
git status
変更したファイルをすべて追加して戻し、コミットの準備をします。これは、もしあれば、どのファイルが変更されていないかを調べるチャンスです。
git add -u
「警告:CRLFはファイル内のLFに置き換えられます」と書かれた多くのメッセージを見るのは完全に安全です。
.gitattributesファイルを書き換えます。
git add .gitattributes
変更をリポジトリーにコミットします。
git commit -m "Normalize all the line endings"
私はWindowsとLinuxの両方を使用していますが、解決策core.autocrlf true
は役に立ちませんでした。 git checkout <filename>
の後には何も変わっていません。
そこで、回避策を使用してgit status
-gitstatus.sh
を置き換えます
#!/bin/bash
git status | grep modified | cut -d' ' -f 4 | while read x; do
x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
x2="$(cat $x | md5sum | cut -d' ' -f 1 )"
if [ "$x1" != "$x2" ]; then
echo "$x NOT IDENTICAL"
fi
done
リポジトリのファイルとその兄弟のmd5sum
を比較するだけです。
出力例:
$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL
行末の違いを無視するスクリプトを作成しました。
コミットリストに追加されず、変更されたファイルが表示されます(行末の違いを無視した後)。引数「add」を追加して、これらのファイルをコミットに追加できます。
#!/usr/bin/Perl
# Usage: ./gitdiff.pl [add]
# add : add modified files to git
use warnings;
use strict;
my ($auto_add) = @ARGV;
if(!defined $auto_add) {
$auto_add = "";
}
my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
my $diff = `git diff -b $mod 2>/dev/null`;
if($diff) {
print $mod."\n";
if($auto_add eq "add") {
`git add $mod 2>/dev/null`;
}
}
}
ソースコード: https://github.com/lepe/scripts/blob/master/gitdiff.pl
更新: