How do you get the history of a file/folder property in SVN?

后端 未结 5 557
悲哀的现实
悲哀的现实 2021-01-01 13:07

What\'s the easiest way to determine when a property was set on a file or folder? Basically, I\'m looking for an equivalent of \"svn blame\" that works on properties.

<
相关标签:
5条回答
  • 2021-01-01 13:12

    The best I can think of is to write a little script or app that uses the svn propget command to dump the current property value to a text file, and then walks back through the revisions dumping the property to another text file and comparing the two. As soon as it detects a change, it prints out the revision number (actually the later revision number that made the change) along with the user who committed it.

    Here's an example command to dump the svn:ignore property for the dictionary directory at revision 80:

    svn propget -r 80 svn:ignore dictionary
    
    0 讨论(0)
  • 2021-01-01 13:20

    One way to get a list of when properties for a given folder has changed is:

    svn log -v . |grep "   M /trunk/datacenter$" -B2
    

    Which gives the following output:

    r963 | someuser | 2013-08-26 20:32:37 +0200 (Mon, 26 Aug 2013) | 4 lines
    Changed paths:
       M /trunk/datacenter
    --
    r908 | someotheruser | 2013-08-15 12:15:03 +0200 (Thu, 15 Aug 2013) | 1 line
    Changed paths:
       M /trunk/datacenter
    --
    r413 | someuser | 2013-04-26 09:02:08 +0200 (Fri, 26 Apr 2013) | 1 line
    Changed paths:
       M /trunk/datacenter
    

    Then you can look at each revision to see what changed:

    $ svn diff -c963
    

    at the bottom:

    ...
    
    Property changes on: .
    ___________________________________________________________________
    Modified: svn:ignore
    ## -22,3 +22,5 ##
    
     .idea
     .classpath
    +
    +dev-config.groovy
    

    Cons:

    • No way to specify which property you're interested in
    • Tedious

    Note: not sure -B2 is sufficient in all cases, as the line " M /trunk/datacenter" might not be the first line

    0 讨论(0)
  • 2021-01-01 13:28

    My svn-extensions toolbox now has svn-prop-annotate and (as a specialization) svn-mergeinfo-annotate commands. They perform poorly (because they run svn log and svn diff for each potential change), and may still have some dependencies and perculiarities to my particular working style, but try them if you're desperate enough.

    Here's some sample output:

    $ svn-mergeinfo-annotate --author karkat -l 5
    67645 ingo.karka    Merged /branches/1.50/foobar:r67488
    67423 ingo.karka    Merged /branches/1.50/foobar:r67315,67331
    67339 ingo.karka    Merged /branches/1.50/foobar:r67279
    53320 ingo.karka    Merged /branches/foo-1.01:r53317
    
    0 讨论(0)
  • 2021-01-01 13:29

    Using the propget or proplist commands seem to be really, really slow.

    For my purposes it was easy enough to do svn diff --properties-only on every revision and store it off. It stores enough information so that you can write some other scripts to do whatever comparing/blaming that is necessary without getting into the network shenanigans or whatever made propget/proplist so slow.

    #!/bin/bash
    
    # 7273 being the highest revision in my repository
    for j in {1..7273}; do
        i=$((j-1))
        echo "$i:$j"
        svn diff --properties-only -r $i:$j https://... > propdiff.$j.txt
    done
    
    0 讨论(0)
  • 2021-01-01 13:39
    #!/bin/bash
    # This is not a great solution, but it works for gathering the data
    
    CURRENT_REVISION=95300
    OLDEST_REVISION=93000
    URL="file:///home/svn/repo/project/dir/target.c"
    PROPERTY_NAME="svn:externals"
    
    for i in `seq $OLDEST_REVISION $CURRENT_REVISION`
    do
      svn -r$i propget "$PROPERTY_NAME" "$URL" | sed -e "s/^/$i\t/"
    done
    
    0 讨论(0)
提交回复
热议问题