Tôi đồng ý với nhận xét về $ Revision $ không phải là công cụ phù hợp cho công việc. Sử dụng công cụ để trích xuất số sửa đổi từ đầu ra của svnthông tin thực sự là điều đúng để thực hiện.Tuy nhiên
Có thêm hai điều cần lưu ý:
svnthông tin sẽ chỉ trả lại các thông tin chính xác nếu svncập nhật đã được chạy trên thư mục với các nguồn kiểm tra ra . Nếu bạn sử dụng các bước xây dựng tùy chỉnh, bạn có lẽ cũng nên thêm một lệnh cho nó.
svnthông tin cũng cung cấp cho bạn thông tin về đường dẫn lưu trữ. Đây là cách duy nhất để phân biệt các nguồn trong số thân cây và một nơi khác, như trong các thẻ . Nếu bạn muốn hộp Giới thiệu của bạn chứa một chuỗi để xác định chính xác các nguồn được sử dụng để xây dựng ứng dụng, hãy đảm bảo rằng đường dẫn kho lưu trữ có sẵn.
Edit:
Đây là một kịch bản lệnh cần được sao chép vào thư mục cấp cao nhất của dự án. Nó sẽ cập nhật các nguồn từ kho, nhận số sửa đổi SVN từ số thông tin svn và so sánh nó với SVN_REVISION không đổi từ tệp src \ SvnRev.inc. Nếu tập tin bị thiếu nó sẽ tạo ra nó, nếu sửa đổi là khác nhau nó sẽ ghi đè lên nó. Nếu svn không khả dụng, nó sẽ ghi số sửa đổi 0 vào tệp.
Tệp kết quả src \ SvnRev.inc có thể đơn giản được đưa vào tệp nguồn. Một tệp tương tự có thể được tạo để được bao gồm trong tài nguyên phiên bản.
@echo off
setlocal
rem determine project top level directory from command file name
set PRJDIR=%~dp0
cd %PRJDIR%
set SVNREVFILE=src\SvnRev.inc
rem execute "svn info", extract "Revision: 1234" line, and take SVN rev from there
svn update
for /F " usebackq tokens=1,2 delims=: " %%i in (`svn info`) do set key=%%i&set value=%%j&call :read-svn-rev
@echo SVN revision "%SVNREV%"
rem extract "const SVN_REVISION = 1234;" line, and take header SVN rev from there
for /F " usebackq tokens=2,4 " %%i in (%SVNREVFILE%) do set name=%%i&set value=%%j&call :read-file-rev
@echo Include file revision "%FILEREV%"
rem check for valid SVN rev
if "%SVNREV%" EQU "" goto :no-svn-ref
rem do not write file if SVN ref is equal
if "%FILEREV%" EQU "%SVNREV%" goto :EOF
@echo Writing svn revision %SVNREV% to %SVNREVFILE%
@echo const SVN_REVISION = %SVNREV% ; > %SVNREVFILE%
goto :EOF
:no-svn-ref
if not exist %SVNREVFILE% goto :no-header-file
rem do not write file if SVN ref is already unset
if "%FILEREV%" EQU "0" goto :EOF
@echo Writing svn revision 0 to %SVNREVFILE%
goto :write-no-version
:no-header-file
@echo Creating %SVNREVFILE% with svn revision 0
:write-no-version
@echo const SVN_REVISION = 0 ; > %SVNREVFILE%
goto :EOF
endlocal
goto :EOF
:read-svn-rev
if "%key%" EQU "Revision" set SVNREV=%value%&
goto :EOF
:read-file-rev
if "%name%" EQU "SVN_REVISION" set FILEREV=%value%&
goto :EOF
Tôi thấy điều này không hoạt động đúng cách. Tôi nghĩ lý do có lẽ là vì bản sao làm việc của tôi luôn chứa cấu trúc dự án hoàn chỉnh của tôi, bao gồm cả các thẻ và các nhánh. Do đó, tập lệnh sẽ lấy số sửa đổi của thay đổi cuối cùng trên toàn cầu thay vì chỉ thư mục mà nó được thực thi. SubWCRev.exe mặt khác hoạt động hoàn hảo với kịch bản sử dụng của tôi. –
@Timo: Chắc chắn nó hoạt động đúng cách, mặc dù nó có thể không làm những gì bạn mong đợi nó làm. Kịch bản này trả về bản sửa đổi toàn cầu, đó là bản sửa đổi mà OP yêu cầu. Tôi không bao giờ tuyên bố điều này để trả lại bản sửa đổi cam kết cuối cùng, tất nhiên là khác nhau. Cảm ơn bạn đã bỏ phiếu xuống. – mghie
@mghie: Sau khi đọc lại câu trả lời của bạn, tôi thừa nhận, có bạn nói đúng. Bạn không bao giờ tuyên bố rằng nó sẽ trả lại bản sửa đổi cam kết cuối cùng trên bản sao làm việc hiện tại. Vì vậy tôi đã bỏ phiếu bầu của tôi xuống. Nó vẫn không phải là giải pháp phù hợp với tôi nhưng tôi chắc rằng những người khác tìm thấy câu trả lời này hữu ích. –