user618: A couple of places on the web mention a free utility called pgnsplit, that does the following:
"A commandline tool to convert pgn-files including games with variation into pgn-files where each variation get its own game."
Sadly, all links to it seem dead. Does anyone know if it is possible to download it anywhere, or to find similar functionality in any other common chess database software?

user9881: This will do it.
https://www.cs.kent.ac.uk/people/staff/djb/pgn-extract/
I built it on mac--works great.

user28204: I don't understand what you meant by pgn split, but I once purchased a chess pgn book and it has all the games (312) in one pgn file. Now I need to split it into each chapter with exactly 12 games each. I searched over the internet and didn't manage to find anything helpful. So I wrote a python program to divide it into separate files.
import os

name = 'Your pgn file here'
units = 12
test_sub = "[E"
path = 'F:/Chess/pgns/'
file = ''

with open(path+name+'.txt', encoding="utf8") as f:
    test_str = f.read()

# using list comprehension + startswith()
# All occurrences of substring in string 
res = [i for i in range(len(test_str)) if test_str.startswith(test_sub, i)]

print('No of games in each pgn =',units)  
print('Total games found =',len(res))
print('Splitting',len(res),'games into',len(res)//units,'pgns.....')

os.mkdir(path+name)

for i in range(len(res)//units):

    file = path+name+'/'+name+'- Unit-'+str(i+1)+'.pgn'

    if i==len(res)//units-1:
        with open(file, 'w', encoding="utf8") as file:
            file.write(test_str[res[i*units]:len(test_str)])
    else:
        with open(file, 'w', encoding="utf8") as file:
            file.write(test_str[res[i*units]:res[(i+1)*units]-1])

print('Success!!')

Note: This divides the given pgn into equal number of files mentioned as units in the program, it doesn't divide a pgn into separate pgn's based on variations.

user915: The only one I've found that will probably do what you want is PGN Extract. It's a command line tool, so hopefully you're comfortable with that. It has a Windows binary, but if you need it for Linux or Mac I hope you're comfortable with compiling from source.

Update
It appears PGN Extract will only separate unique games in a single PGN into multiple PGNs, not branches. Sadly PGN Split was one of a kind, and there doesn't appear to be a replacement. One of few programs that managed to disappear completely from the internet.

user1175: Here is the author's page courtesy of archive.org.  The zip file on that page includes the readme.
Direct download of the zip file

user12951: As of 2017.04.01, pgn-extract (version 17-38) does provide variation splitting functionality via its --splitvariants flag. So, if you want this in a Windows/Linux/Mac OS environment it is available. Disclosure: I am the author of pgn-extract.

618: <p>A couple of places on the web mention a free utility called pgnsplit, that does the following:
"A commandline tool to convert pgn-files including games with variation into pgn-files where each variation get its own game."</p>

<p>Sadly, all links to it seem dead. Does anyone know if it is possible to download it anywhere, or to find similar functionality in any other common chess database software?</p>
 9881: <p>This will do it.</p>

<p><a href="https://www.cs.kent.ac.uk/people/staff/djb/pgn-extract/" rel="nofollow">https://www.cs.kent.ac.uk/people/staff/djb/pgn-extract/</a></p>

<p>I built it on mac--works great.</p>
 28204: <p>I don't understand what you meant by pgn split, but I once purchased a chess pgn book and it has all the games (312) in one pgn file. Now I need to split it into each chapter with exactly 12 games each. I searched over the internet and didn't manage to find anything helpful. So I wrote a python program to divide it into separate files.</p>
<pre><code>import os

name = 'Your pgn file here'
units = 12
test_sub = &quot;[E&quot;
path = 'F:/Chess/pgns/'
file = ''

with open(path+name+'.txt', encoding=&quot;utf8&quot;) as f:
    test_str = f.read()

# using list comprehension + startswith()
# All occurrences of substring in string 
res = [i for i in range(len(test_str)) if test_str.startswith(test_sub, i)]

print('No of games in each pgn =',units)  
print('Total games found =',len(res))
print('Splitting',len(res),'games into',len(res)//units,'pgns.....')

os.mkdir(path+name)

for i in range(len(res)//units):

    file = path+name+'/'+name+'- Unit-'+str(i+1)+'.pgn'

    if i==len(res)//units-1:
        with open(file, 'w', encoding=&quot;utf8&quot;) as file:
            file.write(test_str[res[i*units]:len(test_str)])
    else:
        with open(file, 'w', encoding=&quot;utf8&quot;) as file:
            file.write(test_str[res[i*units]:res[(i+1)*units]-1])

print('Success!!')
</code></pre>
<p>Note: This divides the given pgn into equal number of files mentioned as <code>units</code> in the program, it doesn't divide a pgn into separate pgn's based on variations.</p>
 915: <p>The only one I've found that will probably do what you want is <a href="http://www.cs.kent.ac.uk/people/staff/djb/pgn-extract/" rel="nofollow noreferrer">PGN Extract</a>. It's a command line tool, so hopefully you're comfortable with that. It has a Windows binary, but if you need it for Linux or Mac I hope you're comfortable with compiling from source.</p>

<hr>

<p><strong>Update</strong></p>

<p>It appears PGN Extract will only separate unique games in a single PGN into multiple PGNs, not branches. Sadly PGN Split was one of a kind, and there doesn't appear to be a replacement. One of few programs that managed to disappear <em>completely</em> from the internet.</p>
 1175: <p><a href="http://web.archive.org/web/20120317043018/http://home.online.no/~malin/sjakk" rel="noreferrer">Here is the author's page</a> courtesy of <a href="http://www.archive.org" rel="noreferrer">archive.org</a>.  The zip file on that page includes the readme.</p>

<p><a href="http://web.archive.org/web/20120317043018/http://home.online.no/~malin/sjakk/download/PgnSplit.zip" rel="noreferrer">Direct download of the zip file</a></p>
 12951: <p>As of 2017.04.01, <a href="https://www.cs.kent.ac.uk/people/staff/djb/pgn-extract/" rel="noreferrer">pgn-extract</a> (version 17-38) does provide variation splitting functionality via its --splitvariants flag. So, if you want this in a Windows/Linux/Mac OS environment it is available. Disclosure: I am the author of pgn-extract.</p>
