Làm cách nào để loại bỏ các thay đổi cục bộ trong thanh toán SVN?


197

Tôi muốn gửi một khác biệt để xem xét, cho một Dự án nguồn mở.

Tôi đã nhận được mã bằng SVN (từ thiết bị đầu cuối, Ubuntu). Và tôi đã chỉnh sửa nhỏ trong vài tập tin. Bây giờ chỉ có một thay đổi duy nhất tôi muốn gửi. Phần còn lại của những thay đổi tôi đã thực hiện, là để gỡ lỗi và không còn cần thiết nữa.

Tôi đã tạo khác bằng cách sử dụng svn di > ~/os/firstdiff.diff

Vì vậy, câu hỏi của tôi, Làm thế nào để loại bỏ những thay đổi địa phương của tôi?

Có cách nào để làm điều đó không? Nếu không, tôi sẽ phải đi đến từng tệp và xóa tất cả các chỉnh sửa của mình. Sau đó, tôi sẽ tạo ra một khác biệt mới, và gửi nó.

Câu trả lời:


253

Chỉ cần sử dụng svn revertlệnh, ví dụ:

svn revert some_file.php

Đó là (như mọi lệnh svn khác) được ghi lại tốt trong tài nguyên svnbook hoặc trang man, hoặc thậm chí với svn helplệnh.


2
Ngoại trừ việc Vinayak có thể muốn giữ những thay đổi không thú vị tại địa phương của mình.
Basile Starynkevitch

2
@BasileStarynkevitch: Tôi đã đọc lại câu hỏi và có vẻ như những thay đổi khác là không bắt buộc: "" "Phần còn lại của những thay đổi tôi đã thực hiện, về cơ bản là gỡ lỗi và không còn cần thiết nữa." "" :)
Cédric Julien

1
Phải ... nhưng anh ta có thể muốn giữ chúng xa hơn cho chính mình ... (Câu hỏi của anh ta có thể được hiểu theo cả hai cách).
Basile Starynkevitch

193

Bạn cần hoàn nguyên tất cả các thay đổi bằng lệnh svn Revert :

  • Hoàn nguyên các thay đổi thành một tệp: svn revert foo.c
  • Hoàn nguyên toàn bộ thư mục tệp: svn revert --recursive .

1
tham chiếu đến svn 1.1 hơi cũ, mặc dù thực tế đó là liên kết đầu tiên được cung cấp bởi google ;)
Cédric Julien

rõ ràng một số ký tự trong tên tệp của bạn có thể bị bỏ qua. ví dụ icon@2x.png. svn hoàn nguyên icon@2x.png. svn nói Bỏ qua 'Biểu tượng'.
topwik

1
Đây là câu trả lời tốt nhất. Nó cần được kiểm tra.
rickfoosusa

12
Việc svn revert --recursive .giúp tôi rất nhiều .
Paul Vargas

Đây phải là câu trả lời được chấp nhận, vì --recursivetham số hoàn nguyên mọi thay đổi cục bộ và đây là câu hỏi.
arueckauer

15

Để loại bỏ các thay đổi cục bộ trong một tệp cụ thể:

$ svn revert example_directory/example_file.txt

Để loại bỏ các thay đổi cục bộ trong một thư mục cụ thể:

$ svn revert -R example_directory/

7

Đơn giản svn revertlà đủ cho các poster ban đầu. Tuy nhiên, một điều đơn giản svn revertsẽ không làm trong trường hợp tổng quát hơn khi bạn

  1. có cả chỉnh sửa mà bạn muốn chia sẻ và chỉnh sửa mà bạn không muốn chia sẻ trong cùng một tệp ,
  2. những thay đổi cục bộ mà bạn vẫn quan tâm để giữ cho lợi ích riêng tư của bạn .

Đề nghị sử dụng của @ ErichBSchulz git add -plà rất hợp lý và thường được áp dụng nhiều hơn trong trường hợp như vậy. Câu trả lời chỉ là thiếu một số chi tiết. Giả sử thư mục hiện tại của bạn là thư mục bạn muốn tạo bản vá có thể chia sẻ, bạn có thể làm một cái gì đó như thế này:

  1. Kiểm tra phiên bản nguyên sơ từ lật đổ sang một thư mục khác (chọn tên thư mục không tồn tại, ở đây sử dụng thư mục con TMP/).

    $ url=$(svn info . | awk '/^URL/ {print $2}')
    $ svn checkout "$url" TMP
    
  2. Sử dụng kiểm tra svn nguyên sơ đó làm cơ sở, khởi tạo một kho lưu trữ git, bỏ qua các thư mục .svn; cam kết mọi thứ trong svn head vào kho git tạm thời của bạn

    $ cd TMP                                                     
    $ git init && echo ".svn/" > .gitignore
    $ git add -A && git commit
    $ cd ..
    
  3. Sao chép dữ liệu meta kho git mới được chuẩn bị vào thư mục làm việc ban đầu của bạn; vì thư mục kiểm tra lật đổ nguyên sơ là không cần thiết, bạn có thể thoát khỏi nó. Thư mục làm việc của bạn bây giờ là cả kho git và subversion:

    $ mv TMP/.git .
    $ rm -rf TMP/
    
  4. Bây giờ bạn có thể sử dụng mạnh mẽ và thuận tiện git add -pđể tương tác chọn chính xác những gì bạn muốn chia sẻ và cam kết chúng vào kho git của bạn. Nếu bạn cần thêm tệp vào cam kết, hãy thực hiện git add <file-to-add>trướcgit commit

    $ git add -p                            
    <interactively select (and edit) the chunks you want to share>
    $ git add ${the_list_of_files_not_in_yet_in_svn_you_want_to_add}
    $ git commit
    
  5. Sử dụng cam kết, chuẩn bị một bản vá mà bạn muốn chia sẻ. Với mục đích này, bạn cũng có thể sử dụng git diff HEAD^..HEAD, hoặc git format-patch(cái sau có thể được sử dụng để trực tiếp chuẩn bị các email được gửi có chứa bản vá hoặc nhiều bản vá):

    $ git show -p HEAD > my-mighty-patch.patch
    

Để thoát khỏi dữ liệu git meta, chỉ cần làm rm -rf .git/. Nếu bạn có kế hoạch tiếp tục hack với thư mục làm việc ban đầu, bạn có thể tiếp tục sử dụng gitđể quản lý các thay đổi cục bộ của mình. Trong trường hợp này, bạn có thể sẽ được hưởng lợi từ việc đầu tư học cách sử dụng git svn.

Lưu ý: Nếu bạn quen thuộc với gitđiều này là điều khá tầm thường để ứng biến. Nếu không thì điều này có vẻ hơi lộn xộn. Bạn có thể khái quát hóa cách tiếp cận bằng cách viết một tập lệnh trong số các bước này để thực hiện "cam kết tương tác" hoặc "tạo bản vá tương tác" cho svn có thể được sử dụng mà không cần hiểu về git.


3
Cảm ơn bạn rất nhiều vì ẩn danh -1 mà không có bất kỳ lời giải thích. Dù sao đi nữa, tôi đã dành thời gian để cải thiện câu trả lời bằng cách làm rõ khi phương pháp này có ý nghĩa.
FooF

2
Cảm ơn rất nhiều giả mạo để mở rộng. +1 từ tôi! Đừng lo lắng. Đám đông phẫn nộ.
ErichBSchulz

1
Cảm ơn đã đưa ngón tay cái lên, @ErichBSchulz! Dần dần chúng ta đang làm cho thế giới trở thành một nơi tốt hơn để sống bất chấp những kẻ thù !!! ;-)
FooF

4

Bạn đã có thể sử dụng

 svn diff important/file1.c important/file2.c > $HOME/os/firstdiff.diff

Khi xuất bản diff của bạn, đừng quên cho biết bản sửa đổi mà bạn khác biệt.

Như những người khác trả lời, bạn cũng có thể sử dụng svn revertcẩn thận. Nó phụ thuộc vào việc bạn có muốn giữ các thay đổi cục bộ cho công việc tương lai của mình hay không ...


+1 Đây là giải pháp tốt nhất cho vấn đề, nhưng trong trường hợp này tôi thực sự muốn thoát khỏi mọi thay đổi của mình. Tất nhiên, tôi sẽ không muốn revertthay đổi của mình mọi lúc. Vì vậy, tôi sẽ sử dụng cách của bạn trong tương lai.
Vinayak Garg

3

Đi đến thư mục gốc của kho lưu trữ đó và chạy lệnh sau

svn revert --depth=infinity .

1
svn revert -R .có thể ngắn hơn
jesjimher

1

Bạn có thể sử dụng lệnh commit trên tệp bạn muốn đặt và sử dụng lệnh hoàn nguyên svn để loại bỏ các thay đổi cục bộ còn lại

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.