SVNでファイルに対するすべての履歴変更を表示するにはどうすればよいですか


169

svn diff -r a:b repo 指定した2つのリビジョン間の変更を表示できることを知っています。私が欲しいのは、ファイルを変更したすべてのリビジョンの差分です。そのようなコマンドはありますか?


16
奇妙な名前の「非難」コマンドに隠されています。
goosemanjack 2012

6
私が試してみるまで、@ goosemanjackは冗談だと思っていました。
SSHこの

回答:


181

組み込みのコマンドはないため、通常は次のようにします。

#!/bin/bash

# history_of_file
#
# Outputs the full history of a given file as a sequence of
# logentry/diff pairs.  The first revision of the file is emitted as
# full text since there's not previous version to compare it to.

function history_of_file() {
    url=$1 # current url of file
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -n | {

#       first revision as full text
        echo
        read r
        svn log -r$r $url@HEAD
        svn cat -r$r $url@HEAD
        echo

#       remaining revisions as differences to previous revision
        while read r
        do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
        done
    }
}

その後、次のように呼び出すことができます。

history_of_file $1

35
これまで「ブレースブロックへの侵入」のトリックを見たことはありません。きちんと。

5
このスクリプトのバッチファイルバージョン、fwiw。
ladenedge 2011

これを.bashrcファイルに追加しました。私が起動すると、私は取得 svn: '.' is not a working copy svn: Syntax error in revision argument '@HEAD' svn: Syntax error in revision argument '@HEAD'
Francisc0

1
@ Francisco0:bashrcに最後の行を含めないでください。これは関数定義の一部ではなく、関数への呼び出しです。これは、指定された例がスタンドアロンスクリプトとして使用されることを意図しているためです。
2011年

26
svn log --diff [path_to_file]このように動作します!stackoverflow.com/a/24938573/3185510
Webster

143

あなたが説明したものとは少し異なりますが、これは実際に必要なものかもしれません:

svn blame filename

最後に変更したコミットの時刻と作成者が各行の前に付いてファイルを印刷します。


4
これはすごい!SVNを何年も使用していて、これについて知らなかった:O
はいBarry

4
タイムスタンプを表示するには、verbose / -vオプションが必要な場合があります(私はsvn 1.7.9のデフォルトビルドを使用しています)。
ウェストンC

私の教授はsvnへの最初の非難プラグインを書きました。私はこれをまだ調べなければなりませんでした。彼はこの課題に完全に自己記入しています。:P
ジョセフデイリー2014年

93

コードの変更を含むファイルの全履歴を確認したい場合:

svn log --diff [path_to_file] > log.txt

3
--diffオプションがいつ追加されたかはわかりませんが、svn 1.8.10で動作するため、bashスクリプトは必要ありません
Guillaume Gros

1
svn 1.7.4にはオプションの--diffテストがあるため、svn 1.7.4にはオプションが導入されたと思いますsubversion/tests/cmdline/log_tests.py
2016年

ちょっとしたメモ:履歴の長さによっては、log.txtファイルが完全にレンダリングされるまでにかなり時間がかかる場合があります(ただし、すぐに読み取ることができます)。
Ivan Durst 2016

1
これを最新のXリビジョンに制限するにはどうすればよいですか?
Enigma

@Enigma:--limit <number>オプション付き。このように:svn log --diff --limit 5 [path_to_file]
リード

37

を使用git-svnしてリポジトリをGitリポジトリにインポートしてから、を使用できますgit log -p filename。これは、対応するdiffが後に続くファイルの各ログエントリを示します。


27
gitをインストールし、gitリポジトリを作成し、gitコマンドを使用しますか?質問はタグ付けされ、Subversionについて尋ねられました。
Ken Gentle

21
私はgit-svnでSubversionクライアントとしてgitを使用しています。これは、Subversionリポジトリに対してlog + diff操作を実行する方法です。Gitには、リポジトリを表示するための非常に優れたツールがいくつかありますが、それほど風変わりなアイデアではありません。
グレッグ・ヒューギル

10
上記の誰かが(正直に)素敵なスクリプトを書くことを祝福されています-SVNにはない機能を提供するため。あなたがプッシュしない限り、gitがローカルであることを確認すると、このツールを呼び出すことができます。
Adam Tolley、

また、GUI(選択)を使用してファイルの履歴を表示できる唯一の回答でもあります。他の回答でも、最後のXリビジョンに制限する方法は説明されていません(まったく可能ですか?)。これはgitでは簡単です。git log X..Y -o filename
TamaMcGlinn

21

皮切りに

svn log -q file | grep '^r' | cut -f1 -d' '

これにより、ファイルが変更されたリビジョンのリストが表示されます。これを使用して、への繰り返しの呼び出しをスクリプト化できますsvn diff


4
または...続ける!svn log -q some_file.xxx | grep ^r | awk '{print $1}' | sed -e 's/^r//' | xargs -i svn diff -rHEAD:{} some_file.xxx > ~/file_history.txt素敵な小さなワンライナー(awkはカットと同じです)
Kasapo 2013年

8

奇妙な名前の「非難」コマンドがこれを行います。Tortoiseを使用している場合は、「リビジョンから」ダイアログが表示され、次にファイルごとにリビジョン番号と作成者の行ごとのインジケーターが表示されます。

リビジョン情報を右クリックすると、「ログの表示」ダイアログが表示され、チェックインの一部であった他のファイルとともに、完全なチェックイン情報が表示されます。


1
これは非常に便利ですが、OPが探していたものではありません。これは、現在のファイルの過去の貢献だけでなく、ファイルの完全な履歴です。この完全な履歴は、特定のコードが削除または変更された理由とその時期を振り返るときに役立ちます。
Adam Tolley、

それどころか、その名前はまったく正しい。これは、特定の(がらくた/バグが多い/理解できない)コードのチャンクの原因を誰に告げるかを示します。
ivan_pozdeev 2013年

コマンドの明白な名前が「非難」ではなく「信用」だったとしたら、いいのではないでしょうか。:)
ニック

1
@Nick svn praiseは、svn blameのエイリアスです。
stefgosselin 2013年

@stefgosselin-そのメモをありがとう。選択肢があることを知ってうれしいです!:)
ニック

3

私の知る限り、これを実現する組み込みのsvnコマンドはありません。すべてのdiffを作成するには、いくつかのコマンドを実行するスクリプトを作成する必要があります。より簡単なアプローチは、それがオプションである場合、GUI svnクライアントを使用することです。Eclipseの破壊的なプラグインなど、それらの多くはファイルの履歴をリストするだけでなく、各リビジョンの差分を表示できます。


3

ありがとう、ベンディン。私はあなたの解決策がとても好きです。

最新の変更を最初に表示して、逆の順序で機能するように変更しました。これは、数年にわたって維持されてきた長期のコードで重要です。私は通常、それをより多くにパイプします。

svnhistory elements.py |more

ソートに-rを追加しました。スペックを削除しました。「最初のレコード」の処理。それはそれと比較するものがないので、それは最後のエントリでエラーになります。そこまで下がることはないので一緒に暮らしていますが。

#!/bin/bash                                                                    

# history_of_file                                                              
#                                                                              
# Bendin on Stack Overflow: http://stackoverflow.com/questions/282802          
#   Outputs the full history of a given file as a sequence of                  
#   logentry/diff pairs.  The first revision of the file is emitted as         
#   full text since there's not previous version to compare it to.             
#                                                                              
# Dlink                                                                        
#   Made to work in reverse order                                              

function history_of_file() {
    url=$1 # current url of file                                               
    svn log -q $url | grep -E -e "^r[[:digit:]]+" -o | cut -c2- | sort -nr | {
        while read r
    do
            echo
            svn log -r$r $url@HEAD
            svn diff -c$r $url@HEAD
            echo
    done
    }
}

history_of_file $1

0

このトピックを調査している間、私はたくさんの部分的な答えを見てきました。これは私のために働いたものであり、それが他の人を助けることを願っています。このコマンドは、コマンドラインに出力を表示し、リビジョン番号、作成者、リビジョンタイムスタンプ、および変更内容を示します。

svn blame -v <filename>

検索を簡単にするために、出力をファイルに書き込み、探しているものをgrepできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.