On Thu, 2013-02-21 at 18:17 -0800, Cameron Esfahani wrote: > Oh, I'm serious. > > Don't take my dislike of git to mean that I don't think we should > consider the proposal to migrate edk2 away from svn to git. If the > consensus is to switch, don't let me stand in the way.
Thanks for clarifying that. > What follows is my rant against git. Please skip if you don't care. > > Git has one amazing feature: local commits. But it is hidden behind a > terrible interface. An interface that's so bad, it wears that like a > badge of honor. > > 4.4 million page hits for "what I hate about git". 2.2 million for > "what I hate about svn". 1.4 million for "what I hate about > subversion". > > Wiser people than me have referred to using git as juggling chainsaws. I think there's a lot of truth in that, but I also think that *some* of it is misplaced. Git lets you do a *lot* of things that a less capable VCS simply *cannot* do. If you violate the KISS principle and actually attempt to *use* all those features, you fairly much get what you deserve. It's a bit like using every possible feature of the C++ language, just because it's there. The basic workflow of git (diff, commit, log, show, push, pull) is fairly simple and isn't at all like juggling chainsaws. It's only if you do something more complex that it gets horrid. I think people have a tendency to abuse the 'branch' feature, and that is a violation of the KISS principle which tends to lead to pain. Git makes it cheap to clone a separate *repository*, even if you're doing so for only a few commits. There's no need to force people to deal with branches for anything except for the purpose that we always *used* to use branches for — actual branches of development, like bug-fixes to a stable release. So any time you see people talking about 'topic branches' and how to handle them... yes, that's the juggling chainsaws bit. Don't Do That Then. > People pay real money to buy GUI front ends for git, so they avoid the > command line interface. > > In my experience, the default options to the different git commands, > and the options themselves, are not designed for common usage cases. > It's designed for Linus to manage all the branches, patches, and > submissions for Linux. When you say 'all the branches', it makes me suspect you've been exposed to this "a branch for every thought that enters my head" nonsense. Truly, I'm sorry for that insanity. Please, try to forget you ever saw it. That is *not* what we're suggesting when we suggest that EDK2 move to git. > Well, most of us aren't in that kind of workflow. Even the edk2 > project won't require that level of functionality from it's VCS. > > Here's an example. You use "git log" to get the entire log. If you > want just a single entry, you use "git show". Yeah, that makes sense. I sense sarcasm. If I want to see a log of all the commits, I use 'git log'. It shows me its output in various levels of verbosity, with the default being relatively sane. (And unlike svn, it feeds it to $PAGER so that I can *read* it sanely and it doesn't just scroll right off the screen and out of my scrollback. Causing me to swear, and wait for *another* round-trip to the server to fetch it all *again* to feed it through 'less' this time.) A 'git log' output might look something like this... commit 7d5c23a737d1f2b9aca34731e813aa77eaae4ab5 Author: lpleahy <lpleahy@6f19259b-4bc3-4df7-8a09-765794883524> Date: Fri Feb 8 21:31:16 2013 +0000 Increase sockets performance by increasing the maximum buffer sizes. Tested using: DataSource/DataSink Signed-off-by: lpleahy git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14125 6 commit 1c740a7d05e0ce7ccdefcb453bc532aca1f8d91b Author: lpleahy <lpleahy@6f19259b-4bc3-4df7-8a09-765794883524> Date: Fri Feb 8 21:29:03 2013 +0000 Allow fragmentation of large UDP packets Reviewed-by: Ankit Singh of Dell Signed-off-by: lpleahy git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@14124 6 ... and if I want it to *show* me one of those commits, so I can actually see the changes that were made, then I'll use 'git show'. I sense sarcasm in what you said about 'log' vs. 'show', but I can't for the life of me work out *why* :) I appreciate that sometimes, one gets so used to certain things that one doesn't *realise* why they're illogical. But this particular distinction between 'log' and 'show' has *never* seemed odd to me. It seems to be entirely right. What am I missing? This is the same in Subversion too, isn't it? We have 'svn log' (well 'svn log | less' if you want it to be useful), and we have... erm, ... well I concede if I ever want the equivalent of 'git show' I'll just do a git-svn clone and use git show. Or gitk. I've never found Subversion at all easy to use, and the constant latency of dealing with round-trips to the server makes it horrid to experiment with. > Another example: why isn't the "--rebase" option the default for "git > pull"? It seems to me, that for most people, that's what they'd > want/expect. Some people expect that, but it's not an expectation which should be encouraged. For those coming from a legacy VCS into the 21st century for the first time, it's difficult to understand that history is *not* a simple linear progression; a strict ordering. History in a *distributed* version control system is a DAG. If you and I each clone *today's* EDK2 tree and go off and do our own sets of changes, then our work is pulled back into the tree (which has moved on a little since then), we end up with the following topology (newest at the top) o New HEAD (merging my work) /| | o Upstream commit merging your work | |\ D | C You and I both commit something in our own trees. | | | D | C You and I both commit something in our own trees. | o | Newer upstream commit which came in while were were working \ | / o Original upstream commit we started from | You'll note that the full history is preserved. You and I did our work based on the original commit at the bottom of the above diagram, and that fact is *important*. In a legacy system, our patches would be committed one after the other. We'd end up with history rewritten to be linear, something like o New HEAD | D My second commit | D | C | C | o 'Newer upstream commit' from above | o Original upstream commit we started from In this situation, we've sent our changes in as *patches*, and they've been applied with some minimal manual mangling in order to make them apply and build, if the upstream changes in the interim make that necessary. It might be that the new commit which sneaked in while we were working is actually something which *breaks* your new code. And either it, or your code, might break mine. In a subtle way, rather than an obvious "patch doesn't apply" or "code doesn't build" way. If that happens, it basically looks like you or I didn't do *any* testing as we went along, and our code was completely hosed from the moment we submitted it. There is no 'known good' state in the history that we can go back to and say "hey, it worked here. Where did it all go wrong?" (Which is what the git-bisect tool helps you do.) Admittedly, lots of people are *used* to losing that history, can't quite get their heads around the whole 'history is non-linear' thing, and don't quite want to see why it's important. And those are the people who always want to rebase before they submit things. But they're wrong, and it *shouldn't* be the default behaviour. If we have the proper history, we can go back to the specific state of your tree or mine before it was pulled, and say "hey, it works there. I'm not going to have the guy shot for extreme stupidity after all". And we can *see* that the problem was introduced with the merge, and take a closer look at the interactions between the merged changes. History is *preserved*, not lost. Which is kind of the point of revision control. Merge conflicts like that don't happen all that often, but they *do* happen and they are extremely painful to work out if you've actually thrown away the true history and you're left with something that, according to your version control system, has *never* worked. Wow, that was a very long-winded way to say "hell no, --rebase shouldn't be the default". But the explanation of what distributed version control actually *means* is probably worth putting out there for the peanut gallery. And again, if your workflow is based around --rebase, then of *course* the tools aren't set up to make it easy. That is *not* a good workflow, and it's not something that's particularly optimised for. > But I can dream of a day where the git maintainers have put the same > care and energy that they have in the backend into the command line > interface. To a large extent they have, for the *sane* workflows. But there's a *lot* of stuff that you just shouldn't be doing from day to day. And that stuff isn't what's made easy. > And let's be fair, when you say: > > > … the use of Subversion is a fairly good indicator that I'm not >> likely to like the *code* very much either. > > it should be made clear that everything in that quote is subjective. Oh, most certainly so :) > Personally, in general, I find that if a project is open source, > that's a good indicator, to me, that I'm probably not going to like > the code very much. I think that might be true for me too, in fact. There's a *lot* of code out there, and I dislike *most* of it. In fact, I think it's fair to say that if a project *exists*, that's a fairly good indicator that I'm not going to like it very much :) I tend to like projects in git more than I like projects in svn, certainly. I cannot speak with authority even about my own subjective opinion on "open source projects" vs. "closed source projects". I've been lucky enough to have been exposed to relatively few of the latter in my life, so there isn't enough data to be statistically meaningful. And where I *have* been involved in non-open projects, I've generally been... well, involved. So I've actually had some input into design decisions, and that would presumably skew the results in that direction. It's easy to observe the code of an open source project as a completely impartial, uninvolved third party. Very hard to do that for closed projects, in the general case. > I can count on 2 fingers the number of open source projects that I > think have good, well-designed and thought-out code. Funny thing, > both of those projects currently use subversion. Again, subjective... :) Out of interest, which are they? Is one of them EDK2? And if you have any thoughts on why the OpenConnect VPN client¹ *doesn't* fall under the category of "good, well-designed and thought-out code" for you, I'd be interested to hear them. I certainly have my own answers to that question :) But that's fairly much off-topic, if we weren't already. -- dwmw2 ¹ http://www.infradead.org/openconnect/ http://git.infradead.org/users/dwmw2/openconnect.git (gitweb) git://git.infradead.org/users/dwmw2/openconnect.git
smime.p7s
Description: S/MIME cryptographic signature
------------------------------------------------------------------------------ Everyone hates slow websites. So do we. Make your web apps faster with AppDynamics Download AppDynamics Lite for free today: http://p.sf.net/sfu/appdyn_d2d_feb
_______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel