2012-05-02 41 views
6

Tôi đã thực hiện một cam kết lớn đối với một repo git (60 tệp đã thay đổi, 1635 chèn (+), 3 xóa (-)) và bây giờ tôi nhận ra mình đã sử dụng dấu cách thụt đầu dòng, trong khi phần còn lại của mã sử dụng các tab.Chuyển đổi không gian thành các tab trong dòng tôi đã thay đổi trong cam kết

Vì vậy, tôi muốn thay thế khoảng trống cho tab, nhưng chỉ trong các dòng đã được thay đổi bởi cam kết đó, bởi vì tôi không muốn sửa đổi mã khác có thể sử dụng dấu cách.

Tôi có thể làm như thế nào? Tôi không quan tâm cho dù nó sẽ sửa đổi thư mục làm việc hoặc cam kết ban đầu, hoặc là tốt.

+1

OK, tôi đã giải quyết nó bằng cách sửa đổi tất cả các tệp trong thư mục tôi đã chỉnh sửa và bây giờ tôi sẽ hoàn nguyên các thay đổi không mong muốn. Nhưng tôi vẫn muốn biết liệu có một giải pháp tốt hơn hay không. – svick

Trả lời

3

Bạn có thể thử một tập lệnh nhỏ (washamend) tôi đã viết. Đầu tiên cam kết, sau đó chạy kịch bản này để làm sạch. Nó sử dụng sửa đổi để làm điều đó.

#!/bin/bash -e 
# 
# Rewrite the last commit to remove any trailing whitespace 
# in the new version of changed lines. 
# Then replace space-based indentation with TAB based indentation 
# based on TABS at every eight position 
# 
[[ -z $TRACE ]] || set -x 
trap "rm -f $tmpf" 0 
tmpf1=$TMP/$$.1.diff 
tmpf2=$TMP/$$.2.diff 
git show --binary >$tmpf1 
perl -p -e 's/^(\+.*?)[ \t]+$/$1/; while(m/^(\+\t*)({1,7}\t| {8})(.*)/) { $_=$1."\t".$3."\n"; }' <$tmpf1 >$tmpf2 
if ! cmp -s $tmpf1 $tmpf2 
then 
    git apply --binary --index -R --whitespace=nowarn $tmpf1 
    git apply --binary --index $tmpf2 
    GIT_EDITOR=true git commit --amend 
else 
    echo "No changes" 
fi 
+0

Cảm ơn, đã làm việc một cách hoàn hảo. – svick

+1

Tôi giả sử một thay đổi '{1,7}' và '{8}', thành '{1,3}' và '{4}', nếu cần 4 tab. [perl.foo = 0] –

+0

Perl là chỉ đọc, bạn không thể thay đổi điều đó :), nhưng phải làm điều đó – robinr

Các vấn đề liên quan