2012-11-15 8 views
5

बाइनरी फाइलों से निपटने पर गिट एक फ़ाइल को दूसरे के साथ बदलने पर विचार करने लगता है, संशोधित, नाम बदलें। ऐसा होता है उदा। जब foo-1.0.3.jar साथ या निम्न परीक्षण मामले से foo-1.0.1.jar की जगह:गिट-स्टेटस नाम के रूप में एक नए नाम के साथ एक अद्यतन बाइनरी फ़ाइल क्यों दिखाता है?

$ dd if=/dev/urandom of=test.dat bs=1024 count=10 
$ md5sum test.dat 
8073aef704e9df13b44818371ebbcc0b test.dat 
$ git add test.dat && git commit -m 'add binary file' 
$ mv test.dat test2.dat 
$ git rm test.dat 
$ dd if=/dev/urandom of=test2.dat bs=1 count=1 conv=notrunc 
$ md5sum test2.dat 
21e1ac3ab9ba50c9dad9171f9de7232d test2.dat 
$ git add test2.dat 

अब मैं स्पष्ट रूप से नई सामग्री (कम से कम आंशिक रूप से) और एक नए नाम के साथ एक फ़ाइल है ।

$ git status 
# On branch master 
# Changes to be committed: 
# (use "git reset HEAD <file>..." to unstage) 
# 
#  renamed: test.dat -> test2.dat 
  • क्या कारण है, उदाहरण के लिए: हालांकि, Git इस git status में एक नाम बदलने पर विचार करता है उन दो फाइलों को कितना समान होना चाहिए? ऐसा नहीं लगता है कि test2.dat में पूरी तरह से अलग डेटा है।
  • क्या इसमें कुछ हद तक अजीब दिखने के अलावा कोई नुकसान है? वास्तविक डेटा पूरी तरह ठीक लगता है; पिछले संशोधन की जांच करते समय मुझे उस संशोधन के लिए सही फ़ाइल मिलती है।

उत्तर

4

गिट वास्तव में नामों को संग्रहीत नहीं करता है, यह सिर्फ एक फ़ाइल को हटाकर एक नया पेड़ संग्रहीत करता है और दूसरा जोड़ा जाता है। गिट आदेश जो पेड़ों की तुलना करते हैं (git diff, git log, git status) सामग्री के आधार पर नामों का पता लगाएं।

किसी कारण से नाम बदलने का पता लगाने आपकी फ़ाइलों के लिए आग लगती है। हो सकता है कि आपकी सामग्री समान है यदि आपने /dev/urandom में एन्ट्रॉपी को समाप्त कर दिया है?

संपादित करें: उदाहरण देखें नाम बदलने के बारे में विवरण के लिए How does git detect similar files, for its rename detection?

+0

नहीं, यह हमेशा बाइनरी फ़ाइलों के साथ सफल नहीं होता है। test.dat का नाम बदलकर test2.dat कर दिया गया था और उसके बाद इसमें नई सामग्री शामिल थी। गिट का कहना है कि इसका नाम बदला गया है, ठीक है, इसका नाम बदला गया है (और अपडेट किया गया)। – jamessan

+1

@jamessan: git यह नहीं जान सकता कि मैंने 'mv' और afaik का उपयोग किया है, यह इनोड संख्याओं की जांच नहीं करता है। यह गिट नामों को स्टोर नहीं करता है हालांकि सही है। – ThiefMaster

+0

ओह, ठीक है, मैंने 'notrunc' नहीं देखा! – opqdonut

संबंधित मुद्दे