web-dev-qa-db-ja.com

Gitステータスは行末を無視します/同一のファイル/ WindowsとLinux環境/ドロップボックス/ mled

どうやって作るの

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ステータスに別の新しい行を無視させる方法を知っているのはまだいいでしょう。

61

次のようにcore.autocrlf値を設定してみてください。

git config --global core.autocrlf true
59
Saša Šijak

代わりに、次の設定で.gitattributesを使用します。

# Ignore all differences in line endings
*        -crlf

.gitattributesは、グローバル.gitconfigと同じディレクトリにあります。 .gitattributesが存在しない場合は、そのディレクトリに追加します。 .gitattributesを追加/変更した後、既存のファイルに変更を正常に適用するには、リポジトリのハードリセットを行う必要があります。

32
Trashman

問題 Windowsオペレーティングシステムのgitコマンドに関連:

$ git add --all

警告:LFは...でCRLFに置き換えられます.

ファイルには、作業ディレクトリに元の行末があります。

解像度

$ git config --global core.autocrlf false     
$ git add --all 

警告メッセージは表示されません。

12
winstonhong

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は以下:

  • テキスト
  • バイナリ(Gitが行末を変更してはならないファイル)

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"

10
user4603841

私は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
3
shukshin.ivan

行末の違いを無視するスクリプトを作成しました。

コミットリストに追加されず、変更されたファイルが表示されます(行末の違いを無視した後)。引数「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

更新

  • evandro777による修正:ファイルのファイル名またはディレクトリにスペースがある場合
3
lepe