Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. Other Discussions
  3. The Weird and The Wonderful
  4. Yet another Subversion rant

Yet another Subversion rant

Scheduled Pinned Locked Moved The Weird and The Wonderful
sysadmincollaborationquestionannouncement
36 Posts 19 Posters 26 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • J Offline
    J Offline
    jim lahey
    wrote on last edited by
    #1

    I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

    Z L D B P 10 Replies Last reply
    0
    • J jim lahey

      I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

      Z Offline
      Z Offline
      ZurdoDev
      wrote on last edited by
      #2

      Quote:

      I really hate SVN.

      I have used SVN, Source Safe, and TFS source control and none have been perfect when multiple people work on the same file at the same time. I have had issues with all of them.

      There are only 10 types of people in the world, those who understand binary and those who don't.

      Q 1 Reply Last reply
      0
      • Z ZurdoDev

        Quote:

        I really hate SVN.

        I have used SVN, Source Safe, and TFS source control and none have been perfect when multiple people work on the same file at the same time. I have had issues with all of them.

        There are only 10 types of people in the world, those who understand binary and those who don't.

        Q Offline
        Q Offline
        QuiJohn
        wrote on last edited by
        #3

        ryanb31 wrote:

        I have used SVN, Source Safe, and TFS source control and none have been perfect when multiple people work on the same file at the same time.

        We've had people edit the same file at the same time using SVN without problems... we usually avoid conflicts though, but if they happen they've always been marked properly. I have other issues with svn though, like the confusing and varied ways to branch and merge branches, though once you have the proper steps figured out it goes ok. What I find odd is having multiple people editing the same section of the same file simultaneously, seemingly intentionally. Why would you do that? That's bad communication or organization. Whenever it's happened to us it's been an accident or as a result of bad communication/misunderstanding over who was doing what. If you're using tools that automate code generation, e.g. resource editors, then it's hard to coordinate two people doing it, so two people shouldn't do it simultaneously. I know it was an SVN bug in this case, but even when SVN does things correctly with conflicts it can be a nightmare to sort out.

        Look at me still talking when there's science to do When I look out there it makes me glad I'm not you

        Z J 2 Replies Last reply
        0
        • Q QuiJohn

          ryanb31 wrote:

          I have used SVN, Source Safe, and TFS source control and none have been perfect when multiple people work on the same file at the same time.

          We've had people edit the same file at the same time using SVN without problems... we usually avoid conflicts though, but if they happen they've always been marked properly. I have other issues with svn though, like the confusing and varied ways to branch and merge branches, though once you have the proper steps figured out it goes ok. What I find odd is having multiple people editing the same section of the same file simultaneously, seemingly intentionally. Why would you do that? That's bad communication or organization. Whenever it's happened to us it's been an accident or as a result of bad communication/misunderstanding over who was doing what. If you're using tools that automate code generation, e.g. resource editors, then it's hard to coordinate two people doing it, so two people shouldn't do it simultaneously. I know it was an SVN bug in this case, but even when SVN does things correctly with conflicts it can be a nightmare to sort out.

          Look at me still talking when there's science to do When I look out there it makes me glad I'm not you

          Z Offline
          Z Offline
          ZurdoDev
          wrote on last edited by
          #4

          Quote:

          but even when SVN does things correctly with conflicts it can be a nightmare to sort out.

          True. Often the problem comes when someone has checked a file in several times since the other person checked it out. For some reason it struggles on merging. I can't imagine having to write the code for a source control tool so I am grateful for what there is. :)

          There are only 10 types of people in the world, those who understand binary and those who don't.

          1 Reply Last reply
          0
          • J jim lahey

            I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

            L Offline
            L Offline
            LloydA111
            wrote on last edited by
            #5

            Have you tried Git? I've not used it, and from what I hear it can be pretty awkward at times. But it must have some merit considering it's popular use.

                   .-.
                  |o,o|
               ,| \_\\=/\_      .-""-.
               ||/\_/\_\\\_\\    /\[\] \_ \_\\
               |\_/|(\_)|\\\\  \_|\_o\_LII|\_
                  \\.\_./// / | ==== | \\
                  |\\\_/|"\` |\_| ==== |\_|
                  |\_|\_|    ||" ||  ||
                  |-|-|    ||LI  o ||
                  |\_|\_|    ||'----'||
                 /\_/ \\\_\\  /\_\_|    |\_\_\\
            
            OriginalGriffO N 2 Replies Last reply
            0
            • L LloydA111

              Have you tried Git? I've not used it, and from what I hear it can be pretty awkward at times. But it must have some merit considering it's popular use.

                     .-.
                    |o,o|
                 ,| \_\\=/\_      .-""-.
                 ||/\_/\_\\\_\\    /\[\] \_ \_\\
                 |\_/|(\_)|\\\\  \_|\_o\_LII|\_
                    \\.\_./// / | ==== | \\
                    |\\\_/|"\` |\_| ==== |\_|
                    |\_|\_|    ||" ||  ||
                    |-|-|    ||LI  o ||
                    |\_|\_|    ||'----'||
                   /\_/ \\\_\\  /\_\_|    |\_\_\\
              
              OriginalGriffO Offline
              OriginalGriffO Offline
              OriginalGriff
              wrote on last edited by
              #6

              Lloyd Atkinson wrote:

              But it must have some merit considering it's popular use.

              One word: Bieber

              The universe is composed of electrons, neutrons, protons and......morons. (ThePhantomUpvoter)

              "I have no idea what I did, but I'm taking full credit for it." - ThisOldTony
              "Common sense is so rare these days, it should be classified as a super power" - Random T-shirt

              1 Reply Last reply
              0
              • J jim lahey

                I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                D Offline
                D Offline
                DaveAuld
                wrote on last edited by
                #7

                Reading this forum guidelines at the top, I feel this is posted in the wrong forum section. Just saying!

                Dave Find Me On: Web|Facebook|Twitter|LinkedIn


                Folding Stats: Team CodeProject

                1 Reply Last reply
                0
                • L LloydA111

                  Have you tried Git? I've not used it, and from what I hear it can be pretty awkward at times. But it must have some merit considering it's popular use.

                         .-.
                        |o,o|
                     ,| \_\\=/\_      .-""-.
                     ||/\_/\_\\\_\\    /\[\] \_ \_\\
                     |\_/|(\_)|\\\\  \_|\_o\_LII|\_
                        \\.\_./// / | ==== | \\
                        |\\\_/|"\` |\_| ==== |\_|
                        |\_|\_|    ||" ||  ||
                        |-|-|    ||LI  o ||
                        |\_|\_|    ||'----'||
                       /\_/ \\\_\\  /\_\_|    |\_\_\\
                  
                  N Offline
                  N Offline
                  Nemanja Trifunovic
                  wrote on last edited by
                  #8

                  Git is the worst source control system I've ever worked it. Including VSS.

                  utf8-cpp

                  R 1 Reply Last reply
                  0
                  • J jim lahey

                    I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                    B Offline
                    B Offline
                    Brisingr Aerowing
                    wrote on last edited by
                    #9

                    I like Mercurial[^]. Never tried merges or anything (I am the only one using my repos), but apparently Mercurial can handle things like this just fine. There is also Bazaar[^], which I have never used, but it looks like a very good version control system. Very well documented (from what I have seen). I have tried Git, but never really got used to it. EDIT: tries != tried

                    Gryphons Are Awesome! ‮Gryphons Are Awesome!‬

                    1 Reply Last reply
                    0
                    • J jim lahey

                      I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                      P Offline
                      P Offline
                      PIEBALDconsult
                      wrote on last edited by
                      #10

                      Improve your process. It's always best to avoid merges no matter how good your tool is.

                      1 Reply Last reply
                      0
                      • J jim lahey

                        I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                        S Offline
                        S Offline
                        Stuart Dootson
                        wrote on last edited by
                        #11

                        I've used SVN a lot...and had many more problems than success with merges (although the later versions are getting better). I've also used mercurial a lot...and can count the number of merge conflicts I've had on the fingers of one hand. Fundamentally, a DVCS like mercurial or git has much better theoretical underpinnings than SVN. Branches are treated as alternate repositories, NOT just as other sub-trees in a file system. So, anyway - use mercurial (or git, I guess, I just have a prejudice against it :-) ), life'll be that much easier...

                        Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p CodeProject MVP for 2010 - who'd'a thunk it!

                        S 1 Reply Last reply
                        0
                        • J jim lahey

                          I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                          U Offline
                          U Offline
                          User 3760773
                          wrote on last edited by
                          #12

                          Please tell us you are not using the file:/// protocol... I have been using Subversion of years. I have run into problems but nothing like you describe. And trust me, we get file conflicts all the time.

                          1 Reply Last reply
                          0
                          • J jim lahey

                            I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                            E Offline
                            E Offline
                            EdReel
                            wrote on last edited by
                            #13

                            The whole point of version control is to prevent developers from overwriting other developers' source code. Subversion is a complete joke and handling branching and merging is a total nightmare. Simple solution: convert over to an intuitive SCM like git. Once you learn it, all the other solutions become stupid and irrelevant. Ask Linus if you don't believe me. ;)

                            "God gave us two ears and one mouth to remind us we should listen twice as much as we talk." - Author unknown

                            B S 2 Replies Last reply
                            0
                            • E EdReel

                              The whole point of version control is to prevent developers from overwriting other developers' source code. Subversion is a complete joke and handling branching and merging is a total nightmare. Simple solution: convert over to an intuitive SCM like git. Once you learn it, all the other solutions become stupid and irrelevant. Ask Linus if you don't believe me. ;)

                              "God gave us two ears and one mouth to remind us we should listen twice as much as we talk." - Author unknown

                              B Offline
                              B Offline
                              BobJanova
                              wrote on last edited by
                              #14

                              Git might be wonderful but intuitive it is not.

                              1 Reply Last reply
                              0
                              • S Stuart Dootson

                                I've used SVN a lot...and had many more problems than success with merges (although the later versions are getting better). I've also used mercurial a lot...and can count the number of merge conflicts I've had on the fingers of one hand. Fundamentally, a DVCS like mercurial or git has much better theoretical underpinnings than SVN. Branches are treated as alternate repositories, NOT just as other sub-trees in a file system. So, anyway - use mercurial (or git, I guess, I just have a prejudice against it :-) ), life'll be that much easier...

                                Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p CodeProject MVP for 2010 - who'd'a thunk it!

                                S Offline
                                S Offline
                                Stefan_Lang
                                wrote on last edited by
                                #15

                                Stuart Dootson wrote:

                                a DVCS like mercurial or git has much better theoretical underpinnings than SVN. Branches are treated as alternate repositories

                                I don't get that. SVN uses one repository, Mercurial/GIT use many repositories - if anything that should increase the number of required merges, not decrease them, no? :confused:

                                S 1 Reply Last reply
                                0
                                • S Stefan_Lang

                                  Stuart Dootson wrote:

                                  a DVCS like mercurial or git has much better theoretical underpinnings than SVN. Branches are treated as alternate repositories

                                  I don't get that. SVN uses one repository, Mercurial/GIT use many repositories - if anything that should increase the number of required merges, not decrease them, no? :confused:

                                  S Offline
                                  S Offline
                                  Stuart Dootson
                                  wrote on last edited by
                                  #16

                                  I stated that badly, I think. What I meant really, is that when you branch in SVN, you're effectively copying the trunk (or whatever branch you're on) to a new location in the SVN repository (although, of course, it's all done with links, really). With Mercurial or Git, you're just adding a label to the current state of the repository that says what branch the revision is at the tip of. And to be honest, the number of merges doesn't really matter so much - it's how well the system can track the changes you've made that's at issue. With SVN, when you do a merge, the merge code in SVN looks at what files each directory sub-tree contains and tries to merge their current states. With Mercurial (or Git), when you do a merge, the merge code looks for the nearest common ancestor changeset between the two revisions you're merging, then (in effect) replays the changes that give the 'other' revision onto the revision you're merging into. And this extends to other repositories - Hg/Git can easily find common changesets between different repositories, because each changeset is identified by a hash (SHA-1, IIRC). The best description I can find of why DVCS's are better at merging than a centralized VCS like SVN is in Eric Sink's book Version Control By Example[^]:

                                  _

                                  • They’re built on a DAG (see Section 4 in Chapter 4). Merge algorithms need good information about history and common ancestors. A DAG is a better way to represent that kind of information than the techniques used by most centralized tools.
                                  • They keep the developer’s intended changes distinct from the merge she had to do in order to get those changes committed. This approach is less error-prone at commit time, since the developer’s changes are already cleanly tucked away in an immutable changeset. The only thing that needs to be done is the merge itself, so it gets all the attention it needs. Later, when tracking down a problem, it is easy to figure out if the problem happened during the intended changes or the merge, since those two things are distinct in the history
                                  • They deal with whole-tree branches, not directory branches. The path names in the tree are independent of the branch. This improves interoperability with other tooling.

                                  _

                                  To show that, try this: 1) Create an empty repository and create a f

                                  S 1 Reply Last reply
                                  0
                                  • J jim lahey

                                    I don't trust it. Two of us have been working on the same file today, so we agreed he would check his changes in first and I would update mine, merge and commit the merge. I get the go ahead to update, update tells me correctly that the exact same file we've worked on is conflicted. I look at the file. no "mine" or "r.6271" markers anywhere to be seen, but a load of interface implementations are missing. I update again, to no avail. I stubbed out the interface implementations, compiled, ran all my tests and tried to commit only to be told that my file is out of date and needs updating before I can commit so I update again, and hey presto, a handful of marked conflicts in the same file. Nobody else has committed anything in that time. WTF? Last week our build server failed to get the externals we'd set up on a repository, even though a local update got them all. Cue hours of digging around instead of actually being productive. I really hate SVN.

                                    V Offline
                                    V Offline
                                    Vasudevan Deepak Kumar
                                    wrote on last edited by
                                    #17

                                    Did you try having WinMerge as a Merge Tool? That helps resolving quite easily.

                                    Vasudevan Deepak Kumar Personal Homepage
                                    Tech Gossips
                                    The woods are lovely, dark and deep, But I have promises to keep, And miles to go before I sleep, And miles to go before I sleep!

                                    1 Reply Last reply
                                    0
                                    • S Stuart Dootson

                                      I stated that badly, I think. What I meant really, is that when you branch in SVN, you're effectively copying the trunk (or whatever branch you're on) to a new location in the SVN repository (although, of course, it's all done with links, really). With Mercurial or Git, you're just adding a label to the current state of the repository that says what branch the revision is at the tip of. And to be honest, the number of merges doesn't really matter so much - it's how well the system can track the changes you've made that's at issue. With SVN, when you do a merge, the merge code in SVN looks at what files each directory sub-tree contains and tries to merge their current states. With Mercurial (or Git), when you do a merge, the merge code looks for the nearest common ancestor changeset between the two revisions you're merging, then (in effect) replays the changes that give the 'other' revision onto the revision you're merging into. And this extends to other repositories - Hg/Git can easily find common changesets between different repositories, because each changeset is identified by a hash (SHA-1, IIRC). The best description I can find of why DVCS's are better at merging than a centralized VCS like SVN is in Eric Sink's book Version Control By Example[^]:

                                      _

                                      • They’re built on a DAG (see Section 4 in Chapter 4). Merge algorithms need good information about history and common ancestors. A DAG is a better way to represent that kind of information than the techniques used by most centralized tools.
                                      • They keep the developer’s intended changes distinct from the merge she had to do in order to get those changes committed. This approach is less error-prone at commit time, since the developer’s changes are already cleanly tucked away in an immutable changeset. The only thing that needs to be done is the merge itself, so it gets all the attention it needs. Later, when tracking down a problem, it is easy to figure out if the problem happened during the intended changes or the merge, since those two things are distinct in the history
                                      • They deal with whole-tree branches, not directory branches. The path names in the tree are independent of the branch. This improves interoperability with other tooling.

                                      _

                                      To show that, try this: 1) Create an empty repository and create a f

                                      S Offline
                                      S Offline
                                      Stefan_Lang
                                      wrote on last edited by
                                      #18

                                      Stuart Dootson wrote:

                                      when you branch in SVN, you're effectively copying the trunk (or whatever branch you're on) to a new location in the SVN repository (although, of course, it's all done with links, really). With Mercurial or Git, you're just adding a label to the current state of the repository that says what branch the revision is at the tip of.

                                      Actually what you describe for Mercurial/GIT is exactly how the SVN/TSVN documentation describes branching in SVN. The only information stored is the revision number that the branch is based on. So the most recent common ancestor is known.

                                      Stuart Dootson wrote:

                                      1. Create an empty repository and create a file called a on the trunk (in SVN) or default branch (in Hg).
                                      2. Create a branch called test_branch and make it the current branch.
                                      3. Rename the file a to b (using svn rename/hg mv).
                                      4. Merge test_branch back into the trunk/default branch.
                                         
                                        With SVN (version 1.7.8), this resulted in two files on the trunk, a and b.

                                      I currently use SVN 1.7.1 with Tortoise SVN and cannot reproduce this behaviour. I can still see a in the trunk if I go back to an older revision in the repo browser, but I cannot see a and b at the same time anywhere. Also, if I have either file in my working copy, updating to a newer or older revision will exchange the file as appropriate. If you use SVN correctly, you should not have or see both a and b in any single location. I should mention though that i don't have the command line interface installed, I only apply changes through TSVN, so I am less prone to obscure mistakes due to inappropriate command line parameters. I do agree though that SVN can be fickle with respect to changes applied to a file that has been renamed in another branch. It's very eassy to lose those changes if you aren't careful. The best way is to commit all changes and synchronize all existing branches immediately before and after a rename. But of course that is not very practical ... Since version 1.6 (IIRC) SVN does analyze and keep track of already performed merges in a trunk, so it should be able to recognize the greatest common change set and limit the merge to the change sets not yet applied. It surely could do a better job of

                                      S 1 Reply Last reply
                                      0
                                      • S Stefan_Lang

                                        Stuart Dootson wrote:

                                        when you branch in SVN, you're effectively copying the trunk (or whatever branch you're on) to a new location in the SVN repository (although, of course, it's all done with links, really). With Mercurial or Git, you're just adding a label to the current state of the repository that says what branch the revision is at the tip of.

                                        Actually what you describe for Mercurial/GIT is exactly how the SVN/TSVN documentation describes branching in SVN. The only information stored is the revision number that the branch is based on. So the most recent common ancestor is known.

                                        Stuart Dootson wrote:

                                        1. Create an empty repository and create a file called a on the trunk (in SVN) or default branch (in Hg).
                                        2. Create a branch called test_branch and make it the current branch.
                                        3. Rename the file a to b (using svn rename/hg mv).
                                        4. Merge test_branch back into the trunk/default branch.
                                           
                                          With SVN (version 1.7.8), this resulted in two files on the trunk, a and b.

                                        I currently use SVN 1.7.1 with Tortoise SVN and cannot reproduce this behaviour. I can still see a in the trunk if I go back to an older revision in the repo browser, but I cannot see a and b at the same time anywhere. Also, if I have either file in my working copy, updating to a newer or older revision will exchange the file as appropriate. If you use SVN correctly, you should not have or see both a and b in any single location. I should mention though that i don't have the command line interface installed, I only apply changes through TSVN, so I am less prone to obscure mistakes due to inappropriate command line parameters. I do agree though that SVN can be fickle with respect to changes applied to a file that has been renamed in another branch. It's very eassy to lose those changes if you aren't careful. The best way is to commit all changes and synchronize all existing branches immediately before and after a rename. But of course that is not very practical ... Since version 1.6 (IIRC) SVN does analyze and keep track of already performed merges in a trunk, so it should be able to recognize the greatest common change set and limit the merge to the change sets not yet applied. It surely could do a better job of

                                        S Offline
                                        S Offline
                                        Stuart Dootson
                                        wrote on last edited by
                                        #19

                                        Stefan_Lang wrote:

                                        and I suspect the same is true for Mercurial

                                        It is. Beyond Compare 3 does the job for me (in SVN, Hg or Git...)

                                        Stefan_Lang wrote:

                                        I currently use SVN 1.7.1 with Tortoise SVN and cannot reproduce this behaviour...I only apply changes through TSVN, so I am less prone to obscure mistakes due to inappropriate command line parameters.

                                        Well - these are the commands I used - don't think there are any iffy options used...and yes, forward slashes - I use a MinGW bash shell under Windows - much nicer than the Windows command prompt...

                                        svnadmin create /d/svn-repos/test2
                                        svn co file:///d:/svn-repos/test2 test2
                                        cd test2
                                        svn mkdir trunk branches
                                        svn ci . -m "Created structure"
                                        cd trunk
                                        echo "Hello" > a
                                        svn add a
                                        svn ci -m "first"
                                        svn cp . ../branches/test_branch
                                        cd ../branches/test_branch/
                                        svn mv a b
                                        svn ci . -m "Branched"
                                        echo "World" >> b
                                        svn ci b -m "Updated"
                                        cd ../../trunk/
                                        svn update
                                        svn merge --reintegrate ^/branches/test_branch

                                        Looking at the output when I re-do these commands, I think that the commit after renaming a to b in test_branch is where things don't go quite as expected - doesn't seem to pick-up that a has been deleted. Maybe I needed to commit before doing the rename... When all's said and done, though, it doesn't make much difference. Personally, Mercurial is a better fit for me, my mindset, than Subversion, so that's what I'll use when at all possible...and I'm very pleased to have extensions like HgSubversion[^] and Convert[^] to make the job of migrating from SVN to Hg as painless as possible :-)

                                        Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p CodeProject MVP for 2010 - who'd'a thunk it!

                                        S 2 Replies Last reply
                                        0
                                        • S Stuart Dootson

                                          Stefan_Lang wrote:

                                          and I suspect the same is true for Mercurial

                                          It is. Beyond Compare 3 does the job for me (in SVN, Hg or Git...)

                                          Stefan_Lang wrote:

                                          I currently use SVN 1.7.1 with Tortoise SVN and cannot reproduce this behaviour...I only apply changes through TSVN, so I am less prone to obscure mistakes due to inappropriate command line parameters.

                                          Well - these are the commands I used - don't think there are any iffy options used...and yes, forward slashes - I use a MinGW bash shell under Windows - much nicer than the Windows command prompt...

                                          svnadmin create /d/svn-repos/test2
                                          svn co file:///d:/svn-repos/test2 test2
                                          cd test2
                                          svn mkdir trunk branches
                                          svn ci . -m "Created structure"
                                          cd trunk
                                          echo "Hello" > a
                                          svn add a
                                          svn ci -m "first"
                                          svn cp . ../branches/test_branch
                                          cd ../branches/test_branch/
                                          svn mv a b
                                          svn ci . -m "Branched"
                                          echo "World" >> b
                                          svn ci b -m "Updated"
                                          cd ../../trunk/
                                          svn update
                                          svn merge --reintegrate ^/branches/test_branch

                                          Looking at the output when I re-do these commands, I think that the commit after renaming a to b in test_branch is where things don't go quite as expected - doesn't seem to pick-up that a has been deleted. Maybe I needed to commit before doing the rename... When all's said and done, though, it doesn't make much difference. Personally, Mercurial is a better fit for me, my mindset, than Subversion, so that's what I'll use when at all possible...and I'm very pleased to have extensions like HgSubversion[^] and Convert[^] to make the job of migrating from SVN to Hg as painless as possible :-)

                                          Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p CodeProject MVP for 2010 - who'd'a thunk it!

                                          S Offline
                                          S Offline
                                          Stefan_Lang
                                          wrote on last edited by
                                          #20

                                          You never created a branch, you only created a copy of a subdirectory that happened to be named trunk/. That is why you then had two files rather than one. The problem started when after creating the initial repository structure you forgot to checkout the repository trunk. Instead you kept using the repository top level as if it were the trunk, effectively turning it into the trunk and converting the trunk/ and branches/ subfolders into just that: subfolders. You also should have checked out the new branch specifically: you can't work on a branch without checking it out first. The only reason you didn't encounter errors is that you never created one to start with: you only created a new subfolder within your working copy of the repository.

                                          S 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups