Git từ chối đặt lại / hủy tệp


76

Tôi có một dự án với các tệp js nhất định mà tôi không thể cập nhật. Tôi chạy OSX cục bộ và máy chủ từ xa / dàn máy của tôi là Linux (CentOS).

Ngay sau khi nhân bản dự án của tôi cục bộ, tôi nhận thấy rằng tôi có tất cả các tệp đó với trạng thái git modified. Tôi không bao giờ sửa đổi chúng, vì vậy tôi đã cố gắng discard changeshoặc resetchúng, nhưng chúng lại xuất hiện. Thay đổi trong sửa đổi là xóa tất cả các dòng và thêm lại chúng.

Tôi không chắc tại sao điều này lại xảy ra hoặc cách khắc phục nó để trạng thái git của tôi sạch như bình thường.

Đây là một vài dòng từ trạng thái git:

#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/el.js
#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/fa.js
#   modified:   app/webroot/js/ckeditor/plugins/devtools/lang/gu.js

CẬP NHẬT 1:

Bây giờ tôi đã quản lý để cam kết các tệp ở trên, nhưng máy chủ dàn bị khóa vì nó sẽ không kéo các chỉnh sửa mới:

error: Your local changes to the following files would be overwritten by merge:
    app/webroot/js/ckeditor/_source/lang/ar.js
    app/webroot/js/ckeditor/_source/lang/bg.js
    app/webroot/js/ckeditor/_source/lang/bn.js
    app/webroot/js/ckeditor/_source/lang/cs.js
    ...
Aborting

Tôi không thể cam kết / đẩy vì:

Updates were rejected because a pushed branch tip is behind its remote counterpart

Tôi đã thử:

git reset --hard

git stash
git stash drop

Nhưng chúng không hoạt động, không có gì xảy ra.

CẬP NHẬT 2:

git diff đưa cho tôi:

The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/fa.js.
The file will have its original line endings in your working directory.
warning: CRLF will be replaced by LF in app/webroot/js/ckeditor/_source/lang/gu.js.
The file will have its original line endings in your working directory.
...

Nếu các tệp được hiển thị là đã sửa đổi nhiều lần, vui lòng kiểm tra xem có bất kỳ sự khác biệt nào như dòng mới, ký tự điều khiển, v.v. giữa tệp cục bộ và tệp kho lưu trữ của bạn không.
Shunya,

Không, không có. Nó sẽ chỉ hiển thị thay đổi 1 dòng so với tất cả các dòng. Ngoài ra, nếu có bất kỳ thay đổi thực sự nào, tôi có thể loại bỏ chúng, điều này không hoạt động trong trường hợp này.
mgPePe

Câu trả lời:


105

Chuẩn hóa phần cuối dòng

Thay đổi trong sửa đổi là xóa tất cả các dòng và thêm lại chúng.

Điều này là do các dòng mới đang được thay đổi giữa các tệp cam kết và các tệp trên đĩa.

Github có một trang hữu ích hướng dẫn chi tiết cách đối phó với loại vấn đề này, nói tóm lại (đối với linux / OSX), bước một là thay đổi cấu hình git của bạn để nó sắp xếp các kết thúc dòng cho bạn:

git config --global core.autocrlf input

Sau đó cam kết chuẩn hóa kết thúc dòng:

git rm --cached -r .
# Remove everything from the index.

git reset --hard
# Write both the index and working directory from git's database.

git add .
# Prepare to make a commit by staging all the files that will get normalized.
# This is your chance to inspect which files were never normalized. You should
# get lots of messages like: "warning: CRLF will be replaced by LF in file."

git commit -m "Normalize line endings"
# Commit

Và sau đó, phần cuối của dòng phải được xử lý chính xác. Xem trang trợ giúp trên github để biết thêm thông tin hoặc phần có liên quan về định dạng git docs và khoảng trắng .

Giải quyết xung đột máy linux

máy chủ dàn bị khóa vì nó sẽ không kéo các chỉnh sửa mới.

Thông báo lỗi có nội dung "Các thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè bởi hợp nhất:", điều đó có nghĩa là chúng chứa các thay đổi cục bộ cần được cam kết hoặc loại bỏ trước khi tiếp tục. Giả sử sử dụng bình thường cho máy chủ dàn (nó không có bất kỳ thay đổi có chủ ý nào), các thay đổi cục bộ có thể bị loại bỏ. Ví dụ, hãy làm như sau:

$ git fetch origin
# Retrieve updates

$ git reset --hard origin/master
# Forcibly change the current branch to match origin/master

Thao tác này sẽ truy xuất lịch sử kho lưu trữ mà không cần cập nhật bản sao đang làm việc, sau đó cập nhật để khớp chính xác với nhánh chính trong kho lưu trữ. Lưu ý rằng lệnh cuối cùng sẽ loại bỏ tất cả các thay đổi chưa được cam kết.


Cảm ơn bạn! Một câu trả lời đầy đủ như vậy, và bạn đã quan tâm đến xung đột cam kết!
mgPePe

1
Anh vừa cứu em một buổi chiều đau thương.
Jerry Brady,

Tôi đang gặp sự cố tương tự nhưng với hình ảnh. Bạn có nghĩ rằng nó sẽ liên quan đến câu trả lời này?
Will

Có thể - sự khác biệt là gì: kết thúc dòng, tệp thực thi hoặc thứ gì khác? Đối với bất kỳ câu trả lời nào ngoài "yeah that was it" -> hãy đặt một câu hỏi liên quan đến câu trả lời này. Sự khác biệt có liên quan, nếu có sự khác biệt, đó là các tệp hình ảnh là tệp nhị phân và do đó sẽ không bị ảnh hưởng bởi bất kỳ thứ gì liên quan đến kết thúc dòng.
AD7six,

1
Chúng tôi đã có một nhóm nhà thầu có thiện chí thêm .gitattributes với tất cả các chuẩn hóa kết thúc dòng được bật. Điều này gây ra sự nhầm lẫn cho các nhà phát triển khi họ không thể chuyển nhánh vì điều này làm hỏng chỉ mục. Câu trả lời này đã giúp chúng tôi xóa bộ nhớ cache và xây dựng lại chỉ mục (git rm --cached -r. VÀ git reset --hard), nhưng giải pháp tốt nhất cho chúng tôi là xóa toàn bộ .gitattributes để mọi thứ hoạt động như trước khi chúng đã thay đổi nó.
neoscribe

15

Tôi luôn đề cập đến việc đảm bảo rằng của bạn core.autocrlfđược đặt thành false, như trong " Git: bị kẹt repo bằng cách sử dụng stash sau khi chuẩn hóa crlf? "

git config --global core.autocrlf false

Ngoài ra, hãy đảm bảo rằng bạn không có .gitattributes tệp có lệnh eolcố gắng chuyển đổi cuối dòng.
Ý tưởng cơ bản là: bạn vẫn thấy thông báo lỗi đó khi bạn chắc chắn rằng không có chuyển đổi tự động theo bất kỳ loại nào?


Nhưng đề phòng trường hợp, cũng hãy xem xét " Git rebase không thành công," Các thay đổi cục bộ của bạn đối với các tệp sau sẽ bị ghi đè bằng cách hợp nhất ". Không có thay đổi cục bộ nào? "

Tôi đang sử dụng máy Mac và thay đổi cấu hình khó hiểu này dường như đã khắc phục tất cả các tai ương của tôi liên quan đến các thay đổi không theo giai đoạn khi không có.

git config --global core.trustctime false

2
lời khuyên tốt. Thích hợp nhất nếu không có người dùng windows nào cộng tác để chỉnh sửa các dòng mới, hoặc nếu vấn đề chỉ xảy ra với các tệp của nhà cung cấp. Tuy nhiên nếu có một nhóm hỗn hợp của cửa sổ + mac / Linux người dùng - điều này sẽ gây ra khoảng trắng vĩnh viễn thay đổi tùy thuộc vào người chạm vào tập tin cuối cùng. +1.
AD7six,

1
Cảm ơn vì thông tin .gitattributes . Không biết về nó. Trong trường hợp của tôi, đó là lý do tôi không thể hủy các thay đổi. Bây giờ vấn đề đã được giải quyết!
Informatik01

1
Tệp .gitattributes với eol là trường hợp của tôi. Cảm ơn!
JohnnyFun

10

Tôi vừa dành 2 giờ (!) Cho cùng một vấn đề với tệp .svg (Đồ họa Vectơ vô hướng), tệp này liên tục thay đổi sau khi 'hoàn nguyên' mà không có sự can thiệp của tôi.

Vì vậy, tệp hiển thị như đã sửa đổi trong 'trạng thái git' ; hoàn nguyên nó thành công, nhưng nó liên tục thay đổi, vì vậy 'pull' bị lỗi lặp đi lặp lại .... thật khó chịu!

Không may mắn với 'git reset' , 'git ignore' , 'git unsrack', v.v.

Cuối cùng, tôi đã giải quyết nó bằng cách xóa tệp khỏi hệ thống cục bộ của mình (không phải 'git delete' , chỉ cần Shift + Delete) >> bây giờ yêu cầu 'kéo' được chuyển và tệp được tìm nạp từ kho lưu trữ từ xa.

Thật dễ dàng, tôi có thể khóc!


1
Cách tiếp cận thay thế thú vị. +1
VonC

Đây là câu trả lời nếu bạn đang bị mắc kẹt bởi vì bạn kiểm tra một quá khứ cam kết (có nghĩa là bạn không thể thêm một cam kết như đã nêu trong câu trả lời lựa chọn)
lulalala

1
Chắc chắn đó là giải pháp đơn giản nhất đối với tôi. Cảm ơn bạn.
nersoh

5

Sự cố này liên tục xuất hiện với kho lưu trữ bảng ký tự Roll20 trên máy Ubuntu và tôi có thể giải quyết nó bằng cách

#!/bin/sh

# Use in root dir of git repository
# Fixes some newline-related weirdness
git rm --cached -r .
git reset --hard

Tuy nhiên, điều này đã ngừng giải quyết vấn đề hoàn toàn ngày hôm nay và bằng cách xem xét Stack Overflow, tôi tìm thấy thủ phạm là .gitattributestệp của họ :

# Auto detect text files and perform LF normalization
* text=auto

Sau khi git pull origin master, git statustrả lại:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Star Wars Revised RPG/SWRRPG-updated.html

no changes added to commit (use "git add" and/or "git commit -a")

Giải pháp là xóa * text=autodòng khỏi .gitattributes:

$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   .gitattributes

no changes added to commit (use "git add" and/or "git commit -a")

Các thay đổi trên .gitattributescó thể bị hủy và Git vẫn sẽ hài lòng.

Chỉnh sửa + 1d : Đã thử lại "thủ thuật" .gitattributes hôm nay, nhưng git statustrước khi loại bỏ các thay đổi .gitattributes. Không có lý do gì rõ ràng đối với tôi (có thể là bộ nhớ đệm của git status?), Một git statussau đó trả lại điều này một lần nữa:

On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   Star Wars Revised RPG/SWRRPG-updated.html

no changes added to commit (use "git add" and/or "git commit -a")

Làm lại lần nữa, nhưng với git statusinbetween đã hoạt động.


Tài liệu độc đáo. +1
VonC
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.