For more than 20 years I've been coming across files that have a headers or footers like:
$OpenBSD: sshd_config.5,v 1.45 2005/09/21 23:36:54 djm Exp$
/* vim: set ts=8 sw=4 tw=0 noet : */
Yet I've never found exactly where/how either of these tags are generated... Perhaps it just never got my attention enough. Well, all of that changes now.
The rcs
(GNU RCS revision control system) first released in 1991, includes a command called ident
. The ident
command manual page starts:
NAME
ident - identify RCS keyword strings in files
SYNOPSIS
ident [ -q ] [ -V ] [ file ... ]
DESCRIPTION
ident searches for all instances of the pattern $keyword: text $ in the named files or, if no files are named,
the standard input.
Not many people use rcs
these days, but it's also possible to do this with other version managers. The key is to know that a "$...$" string is called an "Ident String".
#include <stdio.h>
static char const rcsid[] =
"$Id: f.c,v 5.4 1993/11/09 17:40:15 eggert Exp $";
int main() { return printf("%s\n", rcsid) == EOF; }
If you want to setup ident strings
with git
, you can use:
$ echo '*.txt ident' >> .gitattributes
$ echo '$Id$' > test.txt
$ git commit -a -m "test"
$ rm test.txt
$ git checkout -- test.txt
$ cat test.txt
Note that before 2020, the default capability of "$ident$" strings in git was quite limited. Fortunately, "filters" have been extended to provide a lot more information, so you should be replicate ident
in git
now.
See this helpful note on Stack Overflow summarizing the 2020 git ident
related changes.
What about the Vim footers?
Often times you come across a file with something like the following at the top or bottom
// vim: noai:ts=4:sw=4 -or- /* vim: noai:ts=4:sw=4 */ -or- /* vim: set noai ts=4 sw=4: */ -or- /* vim: set fdm=expr fde=getline(v\:lnum)=~'{'?'>1'\:'1': */
These are called "vim modelines". The modeline can be within the first or last 5 lines in your file.
Best to only trust modelines on files where you trust the authors (like yourself).
Unfortunately modeline
has been abused before. There are at least 5 CVE related modeline exploits over the years, so you're probably better off using "EditorConfig" for shared projects.