I just wrote a quick but functionally decent implementation of git-cp(1)
, a missing subcommand that Subversion users would certainly get used to. While I desperately wanted it I could imagine why it is not part of the Git core. There are many forms of changeset that could make it difficult for SCM to trace history, and keeping track of file copies would only handle a small part of the problem. For example, you could merge two files into one, move a portion from one file to another, or split a file into two, and recording a hint that a file copy is done would only serve its purpose in the last case. The designers of Git had the insight to recognize that and instead of adding a feature to record a copy, they equipped git-log
and git-diff
with copy/move detection so that a copy can be found when they look back the history, making recorded hints unnecessary as the detection method gets mature enough to work effectively.
But, but. I had been tired of typing cp a b && git add b
every time I feel like using an existing file as a template for making a new file, and thought it would feel great if you could just say git cp a b
to start working on the new file quickly. Some may say the name git cp
is misleading but it is just as evil as git mv
that is too just a type saver. Plus, git-cp
is made not to overwrite an existing file or copy a file to outside of the repository, so it is safe to use.
I also wrote git-touch(1)
for a similar reason. Whenever I want to create a new empty directory, I can say git touch log/.gitignore
instead of a lengthy sequence of mkdir log && touch log/.gitignore && git add log/.gitignore
. There’s also git-untouch(1)
to undo it when you have made a typo or changed your mind on the new file path.
These are all dedicated to those who joy in typing less.
Tag Archives: Shell Script
git-shift: Changing commit timestamps in Git
Git is known to be so flexible that one can even fix or delete old commits, but what would you do if you wanted to change the timestamp of a particular commit? This need can arise for various reasons, such as when a merged commit has picked the unwanted timestamp on squash, when a contributor’s (or your notebook’s) machine clock was obviously far out of sync, and so on.
git-shift (update: repository moved) is the tool I wrote to change dates (timestamps) of specified commits in a git repository. The choice of the name sounds a bit too bold, so maybe I will rename it later—but anyway.
The usage is simple; specify the amount of time you want to shift timestamps by, and a list of commit IDs you want to change timestamps of. (Range notation is currently not supported)
e.g. to move timestamps of commits identified by the IDs f9e8d7c6
and 579acf
two hours backwards:
1 |
$ git-shift -2h f9e8d7c6 579acf |
Use it wisely and enjoy your life, night and day workers! :D
git-info: Displaying information about a Git repository a la `svn info’
I haven’t been writing much in English about technical stuff, so I am going to start this blog with a series of articles that introduce some of my little works.
I picked git-info(1)
to begin with, which is a small shell script that provides Git with a similar functionality to “svn info
“. As a long time user of Subversion who was new to Git I really missed a handy command to see repository information at a glance, so I wrote this.
knu’s git-info at master – GitHub
A sample output (at the time of writing) is as follows.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
% git info Repository Path: /home/knu/src/github/git-info/.git Path: /home/knu/src/github/git-info Remote Repositories: origin git@github.com:knu/git-info.git (fetch) origin git@github.com:knu/git-info.git (push) Remote Branches: origin/HEAD -> origin/master origin/master Local Branches: * master Repository Configuration: [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] fetch = +refs/heads/*:refs/remotes/origin/* url = git@github.com:knu/git-info.git [branch "master"] remote = origin merge = refs/heads/master Last Changed Commit ID: da32fa59f7fab84606ce3c144e636043e96d8063 Last Changed Author: Akinori MUSHA Last Changed Date: Tue Jul 28 10:37:09 2009 +0900 Last Changed Log: Take the directory as a physical path. |
Hope this helps you on your way.