LF को सभी CRLF को बदलने के लिए इतिहास को फिर से लिखना।


32

मैं एक निजी Git रिपॉजिटरी को win32 बॉक्स से उबंटू में स्थानांतरित करने जा रहा हूं। हालांकि मैं एक अंतिम dos2unix प्रतिबद्ध कर सकता हूं, लेकिन मैं पूरे इतिहास को फिर से लिखना चाहता हूं, इसलिए कुछ गिट GUI लॉग / सही ढंग से प्रदर्शित करेगा। जैसे, जीआईटीजी प्रत्येक सीआर / एलएफ के लिए खाली लाइनें सम्मिलित करेगा।

जवाबों:


25

आप git filter-branchउस के लिए उपयोग कर सकते हैं , --tree-filterविकल्प के साथ , और --allशाखा के लिए निर्दिष्ट कर सकते हैं ।

यहाँ एक उदाहरण है (एक अनिक्स-टाइप टेक्स्ट फ़ाइल के साथ खाली निर्देशिका में शुरू किया गया है:

तैयारी:

$ hexdump -C testfile 
00000000  61 0d 0a 62 0d 0a 63 0d  0a                       |a..b..c..|
00000009

$ git init
Initialized empty Git repository in /home/seigneur/tmp/a/.git/

$ git add testfile && git commit -m "dos file checked in"
[master (root-commit) df4970f] dos file checked in
 1 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 testfile

आदेश:

$ git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all

आउटपुट:

Rewrite df4970f63e3196216d5986463f239e51eebb4014 (1/1)dos2unix: converting file testfile to Unix format ...

Ref 'refs/heads/master' was rewritten

$ hexdump -C testfile 
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006

मैं दृढ़ता से पहले से ही पूर्ण बैकअप करने की सलाह देता हूं । अपने लिनक्स मशीन से चलाना (जब तक कि आपके विंडोज़ वातावरण में एक अच्छा शेल सेट न हो जाए) संभवत: आसान है।

संपादित करें: रूपांतरण पहली बार के आसपास उलट गया था।


1
धन्यवाद, इस पोस्ट ने मुझे बहुत मदद की। मेरे पास उनके नाम में रिक्त स्थान के साथ कुछ फाइलें थीं, मूल कमांड में थोड़ा बदलाव ने इसे तय किया git filter-branch --tree-filter 'git ls-files -z | xargs -0 dos2unix' -- --all:। झंडे -zऔर -0बताएं git ls-filesऔर पंक्ति के अंत के रूप में xargsमुद्रित और व्याख्या करें null
इवान

Dos2unix कमांड का एक और विकल्प खुद गिट पर भरोसा करना है:git filter-branch --prune-empty --tree-filter 'git add --renormalize .' -- --all
विलमांता बरनौसकस

6

मैट के जवाब ने इस मुद्दे को सिर पर रख लिया है। दुर्भाग्य से उबंटू लिनक्स पर, संस्करण 10.04 (ल्यूसिड लिंक्स) के साथ शुरू हुआ, dos2unix / unix2dos कमांड अब उपलब्ध नहीं हैं, और इसे fromdos / todos से बदल दिया गया है। इसके अलावा, रूपांतरण आदेशों के दोनों सेटों में द्विआधारी फ़ाइलों के अस्तित्व के लिए विभिन्न अज्ञानता है, इस प्रकार यदि आपके भंडार में चित्र, फ़ॉन्ट आदि हैं, तो वे इस प्रक्रिया से दूषित होने वाले हैं।

मैं बाइनरी फ़ाइल भ्रष्टाचार समस्या के लिए एक वर्कअराउंड ढूंढने में सक्षम था, जो नीचे दिखाए गए अनुसार केवल पाठ फ़ाइलों को सही ढंग से पहचानने और संसाधित करने के लिए लिनक्स 'फाइल' कमांड का उपयोग करता है। नीचे दिए गए आदेश का उपयोग करता है - tag-name-filter विकल्प मौजूदा टैग को संरक्षित करने के लिए उन्हें नए संशोधित कमिट्स में ले जाकर। इसके अलावा यह सुनिश्चित करने के लिए --force ध्वज का उपयोग करता है कि कमांड उस घटना में काम करेगा, जिसे आपने अपने रिपॉजिटरी पर ट्री-फिल्टर चलाया है।

git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*/\1/p" | xargs fromdos' --tag-name-filter cat -- --all

3

और बिना किसी अतिरिक्त उपकरण के (जैसे 'fromdos', 'dos2unix', आदि):

git filter-branch --force --tree-filter 'git ls-files | xargs file | sed -n -e "/.*: .*text.*/s/\(.*\): .*/\1/p" | xargs -0 sed -i"" -e "s/"$(printf "\015")"$//"' --tag-name-filter cat -- --all

Crossplatform (OS X, FreeBSD, Linux) उपयोगी एनालॉग 'fromdos', 'dos2unix':

sed -i'' -e 's/'"$(printf '\015')"'$//'

शायद उपयोगी 'unix2dos':

sed -i '' -e 's|$|'"`printf '\015'`"'|' file.name

यदि आप फरलोली श्योर हैं तो आप क्या कर रहे हैं, आप इस सरल इनलाइन कमांड को "मौजूदा निर्देशिका की सभी फाइलों से" / r "हटाने के लिए उपयोग कर सकते हैं।"

find . -type f -exec sed -i'' -e 's/'"$(printf '\015')"'$//' {} \;

1
इसके बजाय केवल \ r
xdevs23

मुझे लगता है कि इसी sedआह्वान को छोटे से बदला जा सकता है:sed -n -e "s/\(.*\): .*text.*/\1/p"
dma_k
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.