Git repo ve çalışma kopyasında LF eol'unu zorla


170

Github'da barındırılan bir git depom var. Dosyaların çoğu başlangıçta Windows üzerinde geliştirildi ve satır sonları konusunda çok dikkatli değildim. İlk taahhüdü gerçekleştirdiğimde, doğru satır sonlarını uygulamak için herhangi bir git yapılandırması da yoktu. Sonuç olarak benim github deposunda CRLF satır sonları ile birkaç dosya var.

Şimdi kısmen Linux üzerinde gelişiyorum ve satır sonlarını temizlemek istiyorum. Dosyaların github üzerinde LF ile doğru bir şekilde saklanmasını ve çalışma kopyamda LF olmasını nasıl sağlayabilirim?

Ben .gitattributesiçeren bir dosya kurdum text eol=LF; bu doğru mu? Bu taahhüt ve itme ile, sadece rmyerel repo ve istenen etki elde etmek için github yeniden klonlayabilir miyim?




Bunların hiçbiri sorduğum şey değil. Tek geliştiriciyim ve tüm makinelerimi aynı şekilde kurmaya hazırım. Zaten buna bağlı bazı CRLF dosyaları ve farklı makinelerde birkaç klon ile mevcut bir repo var. Her yerde LF olması için repoyu ve her çalışan kopyayı nasıl güncelleyebilirim?
Chowlett

Bu Github rehberine baktınız mı ?
Andy

Yanıtlar:


237

Deponuzda hangi dosyaların olduğu hakkında biraz bilgi olmadan (saf kaynak kodu, resimler, yürütülebilir dosyalar ...), soruyu cevaplamak biraz zor :)

Bunun yanı sıra, Windows veya Linux üzerinde çalıştığınız metin dosyalarının .git deponuzda LF satır sonlarına sahip olduğundan emin olmak istediğiniz için çalışma dizininizdeki satır sonları olarak LF'yi varsayılan olarak kullanmaya hazır olduğunuzu düşüneceğim. . Gerçekten üzgünüm daha güvenli ....

Ancak, daha iyi bir alternatif var: Linux iş dizininizdeki LF satır sonlarından, Windows iş yerinizdeki CRLF satır sonlarından ve deponuzdaki LF satır sonlarından yararlanın.

Kısmen Linux ve Windows üzerinde çalışırken, core.eololarak ayarlandığından nativeve core.autocrlfolarak ayarlandığından emin olun true.

Ardından, .gitattributesdosyanızın içeriğini aşağıdakilerle değiştirin

* text=auto

Bu Git'in taahhütlerde ve çıkışlarda sizin için otomajik hat sonları dönüşümünü işlemesine izin verecektir. İkili dosyalar değiştirilmez, metin dosyaları olarak algılanan dosyalar satır sonlarının anında dönüştürüldüğünü görür.

Ancak, deponuzun içeriğini bildiğiniz gibi Git'e bir el verebilir ve ikili dosyalardan metin dosyalarını algılamasına yardımcı olabilirsiniz.

C tabanlı bir görüntü işleme projesinde çalışmanız şartıyla, .gitattributesdosyanızın içeriğini aşağıdakilerle değiştirin

* text=auto
*.txt text
*.c text
*.h text
*.jpg binary

Bu, uzantısının c, h veya txt olduğu dosyaların deponuzda LF satır sonlarıyla depolanmasını ve çalışma dizininde yerel satır sonlarının bulunmasını sağlar. Jpeg dosyalarına dokunulmaz. Diğerlerinin tümü, yukarıda görüldüğü gibi aynı otomajik filtreden faydalanacaktır.

Tüm bunların iç detaylarını daha iyi anlayabilmek için , bir Githubber olan Tim Clem'den bu çok iyi " Hattınızın sonuna dikkat edin" yazısına gitmenizi öneririm.

Gerçek bir dünya örneği olarak, bir dosyada yapılan değişikliklerin gösterildiği bu işleme de göz atabilirsiniz .gitattributes.

Aşağıdaki yorumu dikkate alarak cevaba GÜNCELLEME

Aslında Windows dizinlerimde CRLF istemiyorum, çünkü Linux ortamım aslında Windows dizinini paylaşan bir VirtualBox

Mantıklı. Açıklama için teşekkürler. Bu özel bağlamda, .gitattributesdosya tek başına yeterli olmayacaktır.

Deponuza karşı aşağıdaki komutları çalıştırın

$ git config core.eol lf
$ git config core.autocrlf input

Deponuz Linux ve Windows ortamınız arasında paylaşıldığından, her iki ortam için de yerel yapılandırma dosyasını güncelleyecektir. core.eolmetin dosyalarının kasalarda LF satır sonlarını taşımasını sağlayacaktır. core.autocrlfsağlayacak potansiyel metin dosyalarındaki CRLF senin depoda LF dönüştürülecektir (bir kopyası kaynaklanan / örneğin operasyonu yapıştırın).

İsteğe bağlı olarak, aşağıdakine benzer bir şey içeren bir dosya oluşturarak Git'in bir metin dosyasının ne olduğunu ayırt etmesine yardımcı olabilirsiniz .gitattributes:

# Autodetect text files
* text=auto

# ...Unless the name matches the following
# overriding patterns

# Definitively text files 
*.txt text
*.c text
*.h text

# Ensure those won't be messed up with
*.jpg binary
*.data binary

Bir .gitattributesdosya oluşturmaya karar verdiyseniz , taahhüt edin .

Son olarak, emin git statusbahsedenler "hiçbir şey (dizin tozunu çalışma) işlemek için" , sonra aşağıdaki işlemi gerçekleştirmek

$ git checkout-index --force --all

Bu, yapılandırma değişikliklerinizi ve .gitattributesdosyayı dikkate alarak ve metin dosyalarınızdaki gözden kaçan olası CRLF'leri değiştirerek dosyalarınızı çalışma dizininizde yeniden oluşturur .

Bu yapıldıktan sonra, çalışma dizininizdeki her metin dosyası LF satır sonlarını taşıyacaktır ve git statusyine de iş dizinini temiz olarak kabul etmelidir.


34
Aslında Windows dizinlerimde CRLF istemiyorum, çünkü Linux ortamım aslında Windows dizinini paylaşan bir VirtualBox; Notepad ++ vb. sadece Windows'ta LF'yi işleyebilirken vi, CRLF'den daha az memnun olur. Sadece bu yüzden değiştirmek istiyor musunuz core.autocrlfolduğu false(ya da input)?
Chowlett

5
Mükemmel cevap. Bu kurulumu kullanan herkes için hızlı bir not: "* text = auto" satırı, sonraki satırların bu ayarı geçersiz kılabilmesi için .gitattributes dosyanızdaki ilk satır olmalıdır.
Ari Patrick

9
@CMCDragonkai Kabuğunuza bağlı olarak git checkout-index --force --alldaha iyi çalışabilir. İkinci nokta, orijinal soru ile ilgili biraz konu dışı görünüyor. Özel bir soru sormaya ne dersiniz?
nulltoken

8
.Gitattributes'ın çalışan bir kopyayı Linux ve Windows arasında paylaşma konusunu neden işleyemediğini anlamıyorum. Cevabınızdaki ve ile tarif edilenle aynı sonucu belirleyemeyiz textve eol=lfelde edemeyiz mi? core.eolcore.autocrlf
DanielSank

10
git checkout-index --force --allbenim için hiçbir şey yapmaz. Ne işleri olduğu GitHub talimatlarında komutların listesini bu konu ile ilgili olarak.
Roman Starkov

129

Git 2.10 (2016-09-03 sürümleri) ile başlayarak, her metin dosyasını ayrı ayrı numaralandırmak gerekli değildir. Git 2.10, eol = lf ile birlikte text = auto davranışını düzeltti . Kaynak .

.gitattributes git deponuzun kökündeki dosya:

* text=auto eol=lf

Ekle ve taahhüt et.

Daha sonra, aşağıdaki adımları uygulayabilirsiniz ve tüm dosyalar şimdi normalleştirilmiştir:

git rm --cached -r .  # Remove every file from git's index.
git reset --hard      # Rewrite git's index to pick up all the new line endings.

Kaynak: Tarafından cevap kenorb .


7
Git 2.10 3 Eylül 2016'da piyasaya sürüldü.
Stil

Ben koştum ve tüm metin olmayan dosyaları tuğla
Anthony

İkili modu belirli dosyalara açıkça ayarlayabilirsiniz. - Ben otomatik algılama, bazı dosyalarda (hala ?!) kırık olduğunu neden merak
koppor

Bu kabul edilen cevap olmalı.
CletusW

25

Tüm metin dosyaları için LF satır sonlarını zorlamak için, deponuzun .gitattributesen üst düzeyinde aşağıdaki satırlarla dosya oluşturabilirsiniz (istediğiniz gibi değiştirin):

# Ensure all C and PHP files use LF.
*.c         eol=lf
*.php       eol=lf

Git'in metin dosyaları olarak kabul ettiği tüm dosyaların LFdepoda normalleştirilmiş ( ) satır sonlarına sahip olmasını sağlar (normalde core.eolyapılandırma, hangisinin varsayılan olarak sahip olduğunuzu kontrol eder).

Yeni özellik ayarlarına bağlı olarak, CRLF içeren metin dosyaları Git tarafından normalleştirilmelidir. Bu otomatik olarak gerçekleşmezse, satır sonlarını değiştirdikten sonra bir havuzu manuel olarak yenileyebilirsiniz, böylece aşağıdaki adımları izleyerek çalışma dizinini yeniden tarayabilir ve uygulayabilirsiniz (temiz çalışma dizini verilir):

$ echo "* text=auto" >> .gitattributes
$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

veya GitHub belgelerine göre :

git add . -u
git commit -m "Saving files before refreshing line endings"
git rm --cached -r . # Remove every file from Git's index.
git reset --hard # Rewrite the Git index to pick up all the new line endings.
git add . # Add all your changed files back, and prepare them for a commit.
git commit -m "Normalize all the line endings" # Commit the changes to your repository.

Ayrıca bakınız: @Charles Bailey yazısı .

Ayrıca, herhangi bir dosyayı metin olarak ele alınmayacak şekilde hariç tutmak istiyorsanız, metin özniteliklerini kaldırın, ör.

manual.pdf      -text

Veya açıkça ikili olarak işaretleyin:

# Denote all files that are truly binary and should not be modified.
*.png binary
*.jpg binary

Daha gelişmiş git normalleştirme dosyasını görmek .gitattributesiçin Drupal çekirdeğini kontrol edin :

# Drupal git normalization
# @see https://www.kernel.org/pub/software/scm/git/docs/gitattributes.html
# @see https://www.drupal.org/node/1542048

# Normally these settings would be done with macro attributes for improved
# readability and easier maintenance. However macros can only be defined at the
# repository root directory. Drupal avoids making any assumptions about where it
# is installed.

# Define text file attributes.
# - Treat them as text.
# - Ensure no CRLF line-endings, neither on checkout nor on checkin.
# - Detect whitespace errors.
#   - Exposed by default in `git diff --color` on the CLI.
#   - Validate with `git diff --check`.
#   - Deny applying with `git apply --whitespace=error-all`.
#   - Fix automatically with `git apply --whitespace=fix`.

*.config  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.css     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.dist    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.engine  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.html    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=html
*.inc     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.install text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.js      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.json    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.lock    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.map     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.md      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.module  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.php     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.po      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.profile text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.script  text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.sh      text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.sql     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.svg     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.theme   text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2 diff=php
*.twig    text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.txt     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.xml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2
*.yml     text eol=lf whitespace=blank-at-eol,-blank-at-eof,-space-before-tab,tab-in-indent,tabwidth=2

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.eot     -text diff
*.exe     -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff
*.jpg     -text diff
*.otf     -text diff
*.phar    -text diff
*.png     -text diff
*.svgz    -text diff
*.ttf     -text diff
*.woff    -text diff
*.woff2   -text diff

Ayrıca bakınız:


2
1. text=autoyanıltıcı. Birlikte text=autove eolbirlikte kullanamazsınız . Ayar eol, metin dosyalarının otomatik olarak algılanmasını devre dışı bırakır. Bu yüzden tüm bu dosya türlerini belirtmelisiniz. Eğer autoetkinleştirilmiş, hepsini sen de gerek olmazdı. 2. textve gerekmez eol=lf. eol=lfetkili bir şekilde ayarlar text.
Ben

2
2 @ @ Ben söylediklerini, açıkça tüm ikili dosyaları işaretlemezseniz, bu yapılandırma şu anda yanlış ve tehlikeli.
Michael R

1
Bunu okudum * text=auto eol=lfilk text=autotarafından geçersiz kılınır eol=lf. Bu özelliği nerede buldunuz? İşte kaynağım: stackoverflow.com/questions/29435156/…
CMCDragonkai

Drupal'dan da kaldırıldığı * text=auto eol=lfiçin örnekten kaldırıldı . Yorumları da kaldırmayı düşünün.
kenorb

4
@Ben'in söylediklerinin artık doğru olmadığını ve her zaman bir hata olduğunu ve amaçlanan bir davranış olmadığını belirtmek önemlidir.
Semmel
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.