Làm thế nào để buộc đẩy một thiết lập lại vào kho lưu trữ từ xa?


94

Chi nhánh chủ từ xa của chúng tôi bằng cách nào đó đã bị rối tung. Mã phát triển hiện tại nằm trên nhánh chính cùng với các cam kết mới nhất. Rõ ràng, mã phát triển chưa sẵn sàng cho nhánh chính.

Vì vậy, trên kho lưu trữ cục bộ của tôi, tôi đã đặt lại thẻ mới nhất git reset --hard (Tag),. Chi nhánh chính hiện đã chính xác trên kho lưu trữ cục bộ của tôi. Bây giờ khi tôi cố gắng đẩy các thay đổi vào kho lưu trữ từ xa git push origin master, tôi gặp lỗi:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Vì vậy, sau khi xem xét xung quanh, tôi đã tìm ra --forcetùy chọn. Vì vậy, tôi đã thực hiện một lực đẩy vào kho lưu trữ từ xa git push --force origin mastervà tôi vẫn gặp lỗi:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

Tôi không thể thực hiện kéo trên chính vì nó chứa mã phát triển không thể có trên chính.


3
Tôi nghĩ rằng thông báo này có nghĩa là bạn không có quyền thực hiện động tác đẩy nhanh không quá nhanh.
svick

3
Bạn đã chính xác, cảm ơn. Trong tệp cấu hình cho kho lưu trữ trên điều khiển từ xa denyNonFastforwards = true,. Tôi đã thay đổi nó thành false, đẩy các thay đổi của mình và sau đó thay đổi nó trở lại true. Cảm ơn một lần nữa tất cả mọi người, vì sự giúp đỡ.
samwell,

2
@samwell xin vui lòng trả lời đánh dấu svick như chấp nhận
hultqvist

@samwell có câu trả lời của svick phù hợp với bạn hay không?
Songo

Đối với những người cần thông tin chi tiết về làm thế nào để vô hiệu hóa denyNonFastForwards như samwell đã làm, hướng dẫn chi tiết có thể được tìm thấy ở đây: stackoverflow.com/a/43721579/2073804
ron190

Câu trả lời:


152

Thông báo có nghĩa là bạn không được phép thực hiện động tác đẩy nhanh không quá nhanh.

Rất có thể kho lưu trữ từ xa của bạn có denyNonFastforwards = truetrong cấu hình của nó. Nếu bạn thay đổi điều đó, git push --forcesẽ hoạt động.

Để thay đổi cài đặt, bạn cần truy cập vào máy bằng kho lưu trữ từ xa. Từ đó, làm git config receive.denynonfastforwards false.


1
Bạn có thể làm một git configcho một máy chủ? Hoặc có lẽ bạn đang sử dụng ẩn dụ đó. Để chơi với những ý tưởng này, tôi đã tạo một repo thử nghiệm trong /opt/git(không gian máy chủ git của tôi) và sau đó tôi sửa đổi cài đặt này trong /opt/git/the_repo/the_repo.git/config. Nhưng một khi thực hiện công git push --force origin SHA:branchviệc theo yêu cầu.
HankCa

4
Thông báo lỗi sẽ có một dòng bắt đầu bằng "error: failed to push some refs to <your repository>" trong đó <your repository> là đường dẫn kết thúc bằng .git, đây là thư mục chứa tệp có tên "config". Tệp "cấu hình" này là nơi bạn có thể đặt từ chốiNonFastforwards = false
emery

1
Nhận xét của @ emery rất có giá trị. Đôi khi thư mục trên máy chủ sẽ có nguồn gốc được đặt thành một cái gì đó như /srv/git/repo.git. Đây là cấu hình đã đặt từ chốiNonFastForwards, không phải thư mục ứng dụng.
Elijah Lynn

1
@hsalimi Nếu bạn không có quyền truy cập vào máy chủ thì bạn cần liên hệ với quản trị viên máy chủ và yêu cầu họ tạm thời tắt tính năng này để bạn có thể bắt buộc đẩy và sau đó bật lại. Mặc dù vậy, không chắc hầu hết đều có thể làm được điều này. Nó có thể phổ biến hơn trong môi trường nội bộ với nhóm lưu trữ của riêng bạn.
Elijah Lynn

1
Điều này ban đầu gây khó chịu, nhưng vẻ đẹp của nó là: điều khiển từ xa được bảo vệ hoàn toàn theo mặc định và nếu bạn là nhà phát triển cố ý và chính xác thực hiện các hành vi phản đối, bạn có thể ghi đè cấu hình này để cho phép hành vi nguy hiểm. Rebasing là điều mà mọi người dùng git nên biết cách làm - và biết khi nào không nên làm. doc1 doc2
moodboom

15

Điều khiển từ xa không cho phép chuyển tiếp không nhanh.

Lựa chọn tốt nhất của bạn là thực hiện git reverttất cả các cam kết không nên có ở đó và cẩn thận hơn trong tương lai.

git revert [commit]sẽ tạo một cam kết mới hoàn tác bất cứ điều gì [commit]đã làm.


Đó là một số cài đặt trên kho lưu trữ từ xa đã chặn tất cả các thay đổi không chuyển tiếp nhanh.
samwell

Nếu bạn làm điều này và nhu cầu Để áp dụng lại cam kết lịch sử không được lấy ra trong một Revert chỉ là thay đổi mã, và bạn sẽ không thể để anh đào chọn các cam kết hoặc hợp nhất
mtpultz

12

Các bước để kích hoạt vĩnh viễn lực đẩy theo kiểu sau

git push -f myrepo my-branch

Chỉnh sửa tệp có tên "config" trong thư mục kết thúc bằng ".git" trên kho lưu trữ từ xa của bạn

Trong đầu ra dòng lệnh của git từ lần đẩy không thành công, hãy tìm dòng có nội dung như:

error: failed to push some refs to 'ssh://user@some-remote-server.mycompany.com/srv/git/myrepo.git

sau đó

ssh user@some-remote-server.mycompany.com
cd /srv/git/myrepo.git
vi config

Đặt "từ chốiNonFastforwards" thành sai

Trong "config", hãy đặt

[receive]
        denyNonFastforwards = false

Bây giờ bạn có thể đẩy từ máy cục bộ của mình với -f

git push -f myrepo my-branch

Làm thế nào để làm điều này mà không cần truy cập vào SSH để trần git repo?
Vladimir Vukanac

Có thể sử dụng lệnh git revert như richo gợi ý? Nếu bạn sao lưu trạng thái hiện tại của repo trước, bạn vẫn có thể hợp nhất mã của mình trong tương lai.
emery

git revertlà loại phức tạp khi bạn có hợp nhất. Phức tạp hơn, trường hợp của tôi có 3 hợp nhất, trong đó một là với cam kết rất cũ ~ 20 khác với phát triển, thứ hai là hợp nhất từ ​​chủ - xấu như địa ngục.
Vladimir Vukanac

1
Có thể giải pháp là đặt lại về trạng thái mong muốn, sao lưu (stash), kéo lại và áp dụng sao lưu (stash).
Vladimir Vukanac

1
MRW bạn vẫn có thể kết hợp các cơ sở mã bạn muốn trên đỉnh của một quay trở / cơ sở mã kéo
đá nhám

11

Hãy thử sử dụng -fcờ và đặt nó sau tên chi nhánh từ xa.

git push origin master -f


1
Không, điều đó cũng không hoạt động. Tôi cũng đã thử git push -f origin mastervà kết quả tương tự. Cả hai lần tôi thử nó, tôi nhận được phiên bản thứ hai của thông báo lỗi.
samwell

2

Bạn không được phép thực hiện git push không tua đi nhanh.

  1. Nếu điều khiển từ xa là GitHub, hãy chuyển đến https://github.com/$USER/$REPO/settings/branchesvà bỏ bảo vệ chi nhánh được đề cập.

    nhập mô tả hình ảnh ở đây

    Bạn phải là quản trị viên của repo để làm điều đó.

  2. Nếu điều khiển từ xa là máy chủ git của riêng bạn, hãy chạy git config receive.denynonfastforwards falseở đó.


Xin lưu ý rằng đối với các phiên bản Git Hub Enterprise, có thể vô hiệu hóa việc đẩy đến nhánh mặc định (thường là "chính") ở cấp phiên bản. Điều này có nghĩa là ngay cả khi "chủ" không được bảo vệ và ngay cả khi bạn là quản trị viên trang web, bạn sẽ không thể thực hiện ép buộc đến nhánh mặc định. Giả sử bạn có quyền, bạn có thể tạm thời giải quyết vấn đề này bằng cách chuyển nhánh mặc định sang một cái gì đó khác, thực hiện lực đẩy của bạn và sau đó chuyển trở lại.
Christopher Hunter

2

Cách tốt nhất để giải quyết vấn đề này là xóa nhánh từ xa và gửi lại:

git push origin master --delete
git push origin master

0

Sự cố xảy ra do nhánh hiện tại không được định cấu hình đúng cho PULL . Trước tiên, hãy kiểm tra xem nhánh ngược dòng có được cấu hình đúng cho việc kéo hay không bằng cách sử dụng - git remote show origin. Bạn có thể tìm thấy nó trong phần - chi nhánh địa phương cấu hình cho 'pull git': . Nếu không, hãy định cấu hình nó bằng:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

Đặt tên chi nhánh thích hợp cho người giữ chỗ - MYBRANCH


0

Tôi đang sử dụng nhóm lệnh này để đặt lại repo từ xa của mình, điều này sẽ khởi tạo lại repo cục bộ của bạn và liên kết lại với repo từ xa của bạn sau đó buộc đẩy các bản cập nhật.

Tôi nghĩ rằng cách này sẽ không hiệu quả trong trường hợp của bạn, nhưng có thể hữu ích cho người khác

chuyển đến thư mục nguồn sau đó chạy các lệnh: lưu ý rằng đó https://github.com/*.gitlà liên kết repo từ xa của bạn

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**


0

Đối với tôi, gợi ý của @svick đã chỉ ra đúng hướng. Vì máy chủ git tôi muốn sửa đổi thực sự là hộp của tôi, tôi đã đăng nhập vào nó và thực hiện git config --global receive.denynonfastforwards falsethay đổi tất cả các repo để chấp nhận một lần đẩy không phải ff bắt buộc. Không hoạt động ngoài hộp. Những gì tôi tìm thấy là trong cấu hình đã được receive.denynonfastforwards=truethiết lập và không thể xóa nó bằng git config --global --unset receive.denynonfastforwards. Tuy nhiên, thực hiện chỉnh sửa trong repo theo cách thủ công ( vi config) đã hoạt động.


0

Tôi đã giải quyết bằng cách xóa nhánh chính khỏi được bảo vệ và cũng mặc định, chỉ hơn các quy tắc nhánh được hỗ trợ trong thiết lập kho lưu trữ.

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.