Git có thể tự động chuyển đổi giữa các không gian và các tab?


196

Tôi sử dụng các tab để thụt lề trong các chương trình python của mình, nhưng tôi muốn cộng tác (sử dụng git) với những người sử dụng khoảng trắng thay thế.

Có cách nào để git tự động chuyển đổi giữa các khoảng trắng và tab (giả sử, 4 dấu cách = 1 tab) khi đẩy / tìm nạp không? (tương tự như chuyển đổi CR / LF)


33
PEP8 chính xác là vấn đề của tôi. Mọi người theo dõi nó và tôi bị mắc kẹt với các tab của tôi. Tôi tình cờ nghĩ rằng một lần thụt lề = một tab là điều nên làm (tại sao khoảng trắng? Tại sao 4 khoảng trắng? PEP8 không giải thích điều đó ...). Dù sao, với thủ thuật git này, tôi có thể vui vẻ sử dụng các tab trên máy tính của mình và chia sẻ mã của mình với tất cả những người theo dõi PEP8 ngoài kia.
Olivier Verdier

7
Oh! Tôi sử dụng TextMate và tôi có thể chuyển đổi giữa các khoảng trắng thành các tab. Vấn đề là, khi tôi nhấn tab, tôi thích trình soạn thảo của mình để viết ... tab. Vì vậy, nếu tôi kiểm tra một dự án python có khoảng trắng, tôi sẽ chèn tất cả các loại tab. Tôi phải chuyển đổi thủ công sang các tab, nhưng khi tôi đăng nhập, có vẻ như 1000 lần xóa, 1000 lần bổ sung và các cộng tác viên của tôi sẽ không hài lòng. :-)
Olivier Verdier

6
Lý do PEP8 chỉ định khoảng trắng thay vì các tab là vì các quy tắc thụt đầu dòng tiếp tục. Có hai cách để tiếp tục một dòng quá dài bên trong một ngoặc đơn. Nếu bạn bắt đầu một dòng mới ngay lập tức sau khi cha mẹ bạn chỉ cần thụt dòng. Thay vào đó, nếu bạn đặt một phần nội dung của ngoặc đơn trên dòng đầu tiên thì bạn phải tiếp tục sử dụng ngoặc đơn ở dòng tiếp theo ở cấp độ thụt đầu dòng mở đầu. Nếu bạn sử dụng các tab không hoạt động.
John Christopher Jones

2
@JohnChristopherJones cho tình huống đó, người ta có thể sử dụng các tab để khớp thụt lề với dòng trước đó sau đó khoảng trắng để khớp với một vị trí trong dòng trước đó. Điều này có thể được chuyển đổi sang không gian dễ dàng. Thật không may, điều ngược lại là không đúng, bởi vì nó làm đảo lộn thông tin thụt lề với thông tin căn chỉnh.
Patrick Parker

Câu trả lời:


195

Đây là giải pháp hoàn chỉnh:

Trong kho lưu trữ của bạn, thêm một tệp .git/info/attributeschứa:

*.py  filter=tabspace

Linux / Unix

Bây giờ chạy các lệnh:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

Hệ điều hành X

Đầu tiên cài đặt coreutils với brew:

brew install coreutils

Bây giờ chạy các lệnh:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

Tất cả các hệ thống

Bây giờ bạn có thể kiểm tra tất cả các tập tin của dự án của bạn. Bạn có thể làm điều đó với:

git checkout HEAD -- **

và tất cả các tệp python bây giờ sẽ có các tab thay vì dấu cách.

Chỉnh sửa : thay đổi lệnh kiểm tra bắt buộc. Bạn nên cam kết công việc của bạn đầu tiên, tất nhiên.


1
Bộ lọc sạch không hoạt động đối với tôi. Khi tôi làm git thêm. Tôi gặp lỗi "lỗi: bộ lọc ngoài mở rộng --tabs = 4 - không thành công". Tôi đang ở trên Windows. Điều đó làm cho một sự khác biệt?
Jeremy Hicks

2
@Jeremy: mở rộng / hủy mở rộng là các lệnh unix. Bạn sẽ phải tìm các cổng / tương đương của Windows hoặc sử dụng một cái gì đó như Cygwin
Tim

1
Tôi đã tìm thấy phiên bản làm việc bast sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik

3
@ Marc-André Điểm tốt. Tôi thực sự sử dụng các phiên bản coreutils. (Cài đặt homebrew, và sau đó chạy brew install coreutils).
Olivier Verdier

2
Có vẻ như điều này không còn hoạt động nữa, các bộ lọc không làm gì cho tôi. Sau khi kiểm tra, các tập tin vẫn còn chỗ trống. Bất kỳ cập nhật về điều này?
Philipp Ludwig

141

Có, một giải pháp tiềm năng là sử dụng trình điều khiển bộ lọc thuộc tính git (xem thêm sách GitPro ), để xác định cơ chế smudge / clean.

văn bản thay thế

Theo cách đó:

  • mỗi khi bạn kiểm tra một số tệp của repo của bạn, không gian có thể được chuyển đổi trong các tab,
  • nhưng khi bạn đăng ký (và đẩy và xuất bản), những tệp tương tự sẽ được lưu trữ lại chỉ bằng khoảng trắng.

Bạn có thể khai báo trình điều khiển bộ lọc này (được đặt tên ở đây ' tabspace') trong .git/info/attributes(đối với bộ lọc được áp dụng cho tất cả các tệp trong repo Git), với nội dung sau:

*.py  filter=tabspace

Bây giờ chạy các lệnh:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

Xem câu trả lời của Olivier để biết ví dụ làm việc cụ thể về một bộ hướng dẫn nhoè / sạch như vậy.


Thật không may, nó chỉ không hoạt động. Tôi đã làm theo tất cả các hướng dẫn, nhưng git không áp dụng fiter. :-( Khi tôi thanh toán, bộ lọc smudge không được áp dụng và khi tôi đăng ký, đôi khi không có gì xảy ra ... git rất bực bội ...
Olivier Verdier

@Olivier: Lạ thật, tôi chưa bao giờ gặp vấn đề gì với điều đó, miễn là tôi cẩn thận giới hạn phạm vi của bộ lọc thuộc tính (chỉ một cây con cụ thể, chỉ cho một loại tệp cụ thể) để không làm chậm quá trình thanh toán / kiểm tra- đang tiến hành. Xem ví dụ stackoverflow.com/questions/62264/
Mạnh

Cảm ơn! Bây giờ nó hoạt động. Xem giải pháp hoàn chỉnh: stackoverflow.com/questions/2316677/ từ
Olivier Verdier

@Vonc: có lẽ người ta nên xóa --globalcờ, vì điều này sẽ ám chỉ, bạn gửi không gian cho mọi dự án hợp tác ...
Willem Van Onsem

@CommuSoft chỉ dành cho các dự án có quyền .gitattributes. Nhưng có, sẽ dễ hiểu hơn nếu cấu hình được giữ cục bộ cho repo. Tôi đã chỉnh sửa câu trả lời.
VonC

39

Thông tin rất hữu ích cho mọi người sử dụng GitHub (hoặc dịch vụ tương tự khác)

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

Sau đó, tôi có hai tập tin: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

Làm việc trên các dự án cá nhân

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

Theo cách đó, khi cuối cùng bạn đẩy công việc của mình lên github, nó sẽ không trông ngớ ngẩn trong chế độ xem mã với 8 space tabshành vi mặc định trong tất cả các trình duyệt.

Đóng góp cho các dự án khác

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

Bằng cách đó bạn có thể làm việc với các tab bình thường trong 2 space indentedcác dự án.

Tất nhiên bạn có thể viết giải pháp tương tự để chuyển đổi từ 4 space to 2 spaceđó là trường hợp nếu bạn muốn đóng góp cho các dự án do tôi xuất bản và bạn có xu hướng sử dụng 2 khoảng trắng trong khi phát triển.


2
Liên quan: Lưu cấu hình git như một phần của kho lưu trữ ; cũng lưu ý rằng bạn có thể sử dụng (và cam kết) một .gitattributestệp trong repo của mình
Tobias Kienzler

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.