Git içindeki ikili dosyaları nasıl ayırt edebilirim?


28

Git içindeki ikili dosyaları dağıtmak için, bir difftool kurmam gerektiğini düşünüyorum.

Hangi difftools işe yarıyor? Parametreleri nasıl girersiniz?


Ne tür bir çıktıyı bir ikili dosya dif aracıyla almak için bekliyorsunuz? Bu ne tür bir ikili dosya? Metin biçiminde işlenip daha sonra karşılaştırılabilecek bir şey mi?
Zoredache

Yanıtlar:


22

textconvBir dosya türü için bir yapılandırma seçeneği ayarlayabilirsiniz . Bkz. Gitattributes ( "İkili dosyaların metin farklarını gerçekleştirme " ) . Ne kullanmanız gerektiğini filetype bağlıdır.

Örnek 1 :

Zip dosyalarının içeriğini değiştirmek istediğinizi söyleyin. Bu durumda aşağıdakini $ GIT_DIR / config dosyasına veya $ HOME / .gitconfig içine koymalısınız.

[diff "zip"]
    textconv = unzip -v

Bir dahaki sefere bir zip dosyasındaki bir farkın bir repoda olmasını istediğinizde unzip -v, her iki sürümü de çağıracak ve elde edilen metni değiştirecektir.

Örnek 2 :

Pdf dosyaları için kullanabilirsiniz pdfinfo;

[diff "pdf"]
    textconv = pdfinfo

Örnek 3 :

Bir dosya türü için belirli bir bilgi kaynağı programı yoksa, örneğin kullanabilirsiniz hexdump(Linux'ta da mevcut FreeBSD ve OSX ile birlikte gelir):

[diff "bin"]
    textconv = hexdump -v -C

Onaltılı olarak dağıtabilirim. Kaç baytın farklı olduğunu veya baytların hangi pozisyonlarda farklı olduğunu bildiğim için mutlu olurum. Git deposunu klonlayarak Hex Fiend'i kullanmaya başladım, böylece dosyanın her iki sürümünü de kontrol edebildim, çünkü programın nasıl başlatılacağını öğrenemedim.
Nick Retallack,

@NickRetallack: Eklenen örneklere bakın.
Roland Smith

2
Git config için Örnek 3'ü ekledim, fakat "git diff" yaptığım zaman hala aynı kısa mesajı veriyor: "İkili dosyalar a / dosya ve b / dosya farklı"
Nick Retallack

1
Libmagic kullanmak istiyorsanız, bunun işe yarayıp yaramadığını görmek için git kaynak koduna bakmak zorundasınız ...
Roland Smith

5
Nihayet işe yaradım, .gitattributes'a * .bin diff = bin ekledikten sonra
Justin Rowe

11

Roland Smith’in cevabı yardımcı oldu, ancak şu anda eksik (yorumlara bakınız) - bunun iki kısmı var.

Depo .git/configdosyanızda veya kişisel genel ~/.gitconfigdosyanızda yeni bir diff komutları tanımlayabilirsiniz , örneğin hexdumpşunları kullanarak bir hex diff komutu :

[diff "hex"]
    textconv = hexdump -v -C
    binary = true

Daha sonra, .gitattributesbu özel diff komutuyla hangi dosyaların kullanılması gerektiğini bildirmek için havuzun dosyasını kullanmanız gerekir:

# Binary files (no line-ending conversions), diff using hexdump
*.bin binary diff=hex

.gitignoreDosya gibi, dosya da .gitattributeshavuzunuza kontrol edilmelidir.

Benim durumumda, ikili olarak ele almak istediğim birkaç farklı dosya uzantısına sahibim (örneğin, Windows'ta git kullanıyorsanız dönüşümleri sonlandırmaktan kaçının) ve ayrıca şu farkları da görebiliyorum hexdump:

https://github.com/peterjc/galaxy_blast/commit/5ec4695e6c3da3926fb100ca006f0f3e88c53c3d

Görüntü dosyalarıyla birlikte kullanmak için bir hexdump diff komutunu tanımlayan başka bir örnek için ayrıca bkz. Https://github.com/resin-io/etcher/pull/1367 .


.gitattributesGlobal olarak da ayarlayabilirsiniz ( global'inizdeki [diff]girişlerle birlikte gitmek için .gitconfig). .gitattributesYerel olarak repoyu yaparsanız, kullanıcının yerel .gitconfigrepo ayarlarını değiştirmesi gerekir, çünkü güvenlik nedeniyle bunlar uzaklara itilmez. Her iki durumda da, her kullanıcının bu davranışı etkinleştirmek için bir şekilde yerel dosyalarını / config ayarlarını güncellemesi gerekir. In .gitconfigaltında [core]eklenti attributesfile = c:/users/<username>/.gitattributesveya nerede bunu küresel (hatta pencerelerde, forwardslashes dikkat edin) yaparsanız saklamak istiyorum.
LightCC

10

Git'i ikili dosyaları diff'i düz metin diff olarak göstermeye zorlamak istiyorsanız, bunun gibi bir --textseçenek kullanın :

git diff --text

-1

Yukarıdakiler bunu yapmanın kapsamlı yollarıdır .. ancak, birkaç dosya için yapmanız gerekiyorsa, aşağıdaki yöntem kullanıyorum:

git checkout HEAD -- /path/to/file > ~/file
vimdiff ~/file /path/to/file

Burada kullanıyorum vimdiffama başka herhangi bir araç kullanabilirsiniz. Bunu tekrar tekrar yapmanız gerekiyorsa, yukarıdakiler küçük bir betiğe de birleştirilebilir.


Bu benim dosyama değişiklikleri atmış gibi görünüyor (ve taahhüt edilen sürümün olmasını istediğim yerde boş bir dosya oluşturdu).
Erhannis
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.